#include <bits/stdc++.h>
using namespace std;
long long readi() {
  long long input = 0;
  char c = ' ';
  while (c < '-') {
    c = getchar();
  }
  bool negative = false;
  if (c == '-') {
    negative = true;
    c = getchar();
  }
  while (c >= '0') {
    input = 10 * input + (c - '0');
    c = getchar();
  }
  if (negative) {
    input = -input;
  }
  return input;
}
string reads() {
  string input = "";
  char c = ' ';
  while (c <= ' ') {
    c = getchar();
  }
  while (c > ' ') {
    input += c;
    c = getchar();
  }
  return input;
}
void printi(long long output) {
  if (output == 0) {
    putchar('0');
    return;
  }
  if (output < 0) {
    putchar('-');
    output = -output;
  }
  vector<char> vout;
  while (output) {
    vout.push_back((output % 10) + '0');
    output /= 10;
  }
  for (int i = vout.size() - 1; i >= 0; i--) {
    putchar(vout[i]);
  }
  return;
}
void prints(string output) {
  for (int i = 0; i < output.length(); i++) {
    putchar(output[i]);
  }
  return;
}
int N, Q;
int minst[4 * 300010], maxst[4 * 300010];
bool qid[300010];
pair<int, int> range[300010];
int val[300010];
int arr[300010];
bool in[300010];
vector<int> v;
map<int, int> seen;
int minquery(int w, int L, int R, int idx) {
  if (idx < L || idx > R) {
    return 1000000000 + 1;
  }
  if (L == R) {
    return minst[w];
  }
  int mid = (L + R) / 2;
  return min(minst[w], min(minquery(2 * w, L, mid, idx),
                           minquery(2 * w + 1, mid + 1, R, idx)));
}
void minupdate(int w, int L, int R, int a, int b, int val) {
  if (b < L || a > R) {
    return;
  }
  if (a <= L && R <= b) {
    minst[w] = min(minst[w], val);
    return;
  }
  int mid = (L + R) / 2;
  minupdate(2 * w, L, mid, a, b, val);
  minupdate(2 * w + 1, mid + 1, R, a, b, val);
  return;
}
void maxupdate(int w, int L, int R, int a, int val) {
  if (a < L || a > R) {
    return;
  }
  if (L > R) {
    return;
  }
  if (L == R) {
    maxst[w] = val;
    return;
  }
  int mid = (L + R) / 2;
  maxupdate(2 * w, L, mid, a, val);
  maxupdate(2 * w + 1, mid + 1, R, a, val);
  maxst[w] = max(maxst[2 * w], maxst[2 * w + 1]);
  return;
}
int maxquery(int w, int L, int R, int a, int b) {
  if (L > R) {
    return -1000000000;
  }
  if (a > R || b < L) {
    return -1000000000;
  }
  if (a <= L && R <= b) {
    return maxst[w];
  }
  int mid = (L + R) / 2;
  return max(maxquery(2 * w, L, mid, a, b),
             maxquery(2 * w + 1, mid + 1, R, a, b));
}
int32_t main() {
  cout << fixed << setprecision(10);
  ios_base::sync_with_stdio(false);
  if (fopen("cf796f.in", "r")) {
    freopen("cf796f.in", "r", stdin);
    freopen("cf796f.out", "w", stdout);
  }
  cin >> N >> Q;
  for (int i = 0; i < N; i++) {
    arr[i] = -1;
  }
  for (int i = 0; i <= 4 * N; i++) {
    minst[i] = 1000000000 + 1;
  }
  for (int i = 0; i < Q; i++) {
    int qq;
    cin >> qq;
    qq--;
    qid[i] = qq;
    if (qid[i]) {
      cin >> range[i].first >> val[i];
      range[i].first--;
    } else {
      cin >> range[i].first >> range[i].second >> val[i];
      range[i].first--;
      range[i].second--;
    }
  }
  for (int i = 0; i < Q; i++) {
    if (qid[i]) {
      if (arr[range[i].first] == -1) {
        arr[range[i].first] = minquery(1, 0, N - 1, range[i].first);
      }
    } else {
      minupdate(1, 0, N - 1, range[i].first, range[i].second, val[i]);
    }
  }
  for (int i = 0; i < N; i++) {
    if (arr[i] == -1) {
      arr[i] = minquery(1, 0, N - 1, i);
    }
    if (arr[i] == 1000000000 + 1) {
      v.push_back(i);
    } else {
      for (int j = 0; j <= 29; j++) {
        if (arr[i] & (1 << j)) {
          in[j] = true;
        }
      }
    }
  }
  for (int i = 0; i < N; i++) {
    maxupdate(1, 0, N - 1, i, arr[i]);
  }
  for (int i = 0; i < Q; i++) {
    if (qid[i]) {
      maxupdate(1, 0, N - 1, range[i].first, val[i]);
    } else {
      if (val[i] != maxquery(1, 0, N - 1, range[i].first, range[i].second)) {
        cout << "NO\n";
        return 0;
      }
    }
  }
  cout << "YES\n";
  if (v.size() >= 2) {
    arr[v[0]] = 536870911;
    for (int i = 1; i < v.size(); i++) {
      arr[v[i]] = 536870912;
    }
  } else if (v.size() == 1) {
    int pos = v[0];
    int best = 0;
    for (int i = 0; i < N; i++) {
      if (i == pos) {
        continue;
      }
      if (seen[arr[i]]) {
        for (int j = 29; j >= 0; j--) {
          if ((1 << j) - 1 <= arr[i]) {
            arr[i] = (1 << j) - 1;
            for (int k = 0; k < j; k++) {
              in[k] = true;
            }
            break;
          }
        }
      }
      seen[arr[i]] = true;
    }
    for (int i = 29; i >= 0; i--) {
      if (best + (1 << i) > 1000000000) {
        continue;
      }
      if (!in[i]) {
        best += (1 << i);
      }
    }
    arr[pos] = best;
  } else {
    for (int i = 0; i < N; i++) {
      if (seen[arr[i]]) {
        for (int j = 29; j >= 0; j--) {
          if ((1 << j) - 1 <= arr[i]) {
            arr[i] = (1 << j) - 1;
            for (int k = 0; k < j; k++) {
              in[k] = true;
            }
            break;
          }
        }
      }
      seen[arr[i]] = true;
    }
  }
  for (int i = 0; i < N; i++) {
    cout << arr[i] << ' ';
  }
  cout << '\n';
  return 0;
}
