#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "YES" : "NO");
  exit(0);
}
void addmod(int &x, int y, int mod = 1000000007) {
  x += y;
  if (x >= mod) x -= mod;
  assert(x >= 0 && x < mod);
}
void et() {
  puts("-1");
  exit(0);
}
int mx[300105];
const int MN = (1 << 20) + 5;
struct jny {
  int M, T[MN];
  void init(int sz) {
    for (M = 1; sz + 2 > M; M <<= 1)
      ;
    for (int(i) = 1; (i) <= (int)(M + M - 1); (i)++) T[i] = (1 << 30);
  }
  int qy(int l) {
    l += M;
    int ans = T[l];
    while (l > 1) {
      ans = min(ans, T[l >> 1]);
      l >>= 1;
    }
    return ans;
  }
  void upt(int l, int r, int ans) {
    for (l = l + M - 1, r = r + M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
      if (~l & 1) T[l ^ 1] = min(ans, T[l ^ 1]);
      if (r & 1) T[r ^ 1] = min(ans, T[r ^ 1]);
    }
  }
} js;
struct mb {
  int M, T[MN];
  void init(int sz) {
    for (M = 1; sz + 2 > M; M <<= 1)
      ;
  }
  void clear() { memset(T, 0, sizeof T); }
  void upt(int l, int val) {
    l += M;
    T[l] = val;
    while (l > 1) {
      T[l >> 1] = max(T[l], T[l ^ 1]);
      l >>= 1;
    }
  }
  int qy(int l, int r) {
    int ans = 0;
    for (l = l + M - 1, r = r + M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
      if (~l & 1) ans = max(ans, T[l ^ 1]);
      if (r & 1) ans = max(ans, T[r ^ 1]);
    }
    return ans;
  }
} jb;
struct qqq {
  int t, l, r, k, d, x;
  void rd() {
    scanf("%d", &t);
    if (t == 1)
      scanf("%d%d%d", &l, &r, &x);
    else
      scanf("%d%d", &k, &d);
  }
} q[300105];
bool vis[300105];
void pp() {
  puts("YES");
  for (int(i) = 1; (i) <= (int)(n); (i)++) {
    if (mx[i] == (1 << 30)) mx[i] = 0;
    printf("%d ", mx[i]);
  }
  exit(0);
}
void fmain(int tid) {
  scanf("%d%d", &n, &m);
  for (int(i) = 1; (i) <= (int)(m); (i)++) q[i].rd();
  js.init(n);
  for (int(i) = 1; (i) <= (int)(n); (i)++) mx[i] = (1 << 30);
  for (int(i) = 1; (i) <= (int)(m); (i)++) {
    if (q[i].t == 1)
      js.upt(q[i].l, q[i].r, q[i].x);
    else if (!vis[q[i].k]) {
      mx[q[i].k] = js.qy(q[i].k);
      vis[q[i].k] = 1;
    }
  }
  for (int(i) = 1; (i) <= (int)(n); (i)++)
    if (!vis[i]) mx[i] = js.qy(i);
  jb.init(n);
  for (int(i) = 1; (i) <= (int)(n); (i)++) jb.upt(i, mx[i]);
  for (int(i) = 1; (i) <= (int)(m); (i)++) {
    if (q[i].t == 2)
      jb.upt(q[i].k, q[i].d);
    else {
      int tmp = jb.qy(q[i].l, q[i].r);
      if (tmp != q[i].x) etp();
    }
  }
  vector<int> fs;
  for (int(i) = 1; (i) <= (int)(n); (i)++)
    if (mx[i] == (1 << 30)) fs.push_back(i);
  if (fs.size() > 1) {
    mx[fs[0]] = ((1 << 29) - 1);
    mx[fs[1]] = (1 << 29);
    pp();
  }
  set<int> sg;
  int ans = 0;
  for (int(i) = 1; (i) <= (int)(n); (i)++)
    if (mx[i] != (1 << 30)) {
      if (sg.find(mx[i]) == sg.end()) {
        sg.insert(mx[i]);
        ans |= mx[i];
      } else {
        if (mx[i] == 0) continue;
        int j = 29;
        while (((1 << j) & mx[i]) == 0) j--;
        if (j == 0) continue;
        mx[i] = (1 << j) - 1;
        ans |= mx[i];
      }
    }
  if (!fs.empty()) {
    int tmp = 0;
    for (int j = 29; j >= 0; j--)
      if ((ans & (1 << j)) == 0) {
        if (tmp + (1 << j) <= (1000000000)) tmp += (1 << j);
      }
    mx[fs[0]] = tmp;
  }
  pp();
}
int main() {
  int t = 1;
  for (int(i) = 1; (i) <= (int)(t); (i)++) {
    fmain(i);
  }
  return 0;
}
