#include <bits/stdc++.h>
using namespace std;
int t[300006], tf[300006], tr[300006], x[300006];
set<int> s;
int n, m;
int qf, qr, to, ans, seq[300006], res[300006];
int a[300006 * 4], tag[300006 * 4];
void build(int f, int r, int at) {
  a[at] = (1e9) + 1;
  if (f == r) return;
  int mid = (f + r) >> 1;
  build(f, mid, at * 2);
  build(mid + 1, r, at * 2 + 1);
}
void query(int f, int r, int at) {
  ans = min(ans, a[at]);
  if (qf == f && f == r) return;
  int mid = (f + r) >> 1;
  if (qf <= mid)
    query(f, mid, at * 2);
  else
    query(mid + 1, r, at * 2 + 1);
}
void change(int f, int r, int at) {
  if (qf <= f && r <= qr) {
    a[at] = min(to, a[at]);
    return;
  }
  int mid = (f + r) >> 1;
  if (qf <= mid) change(f, mid, at * 2);
  if (qr > mid) change(mid + 1, r, at * 2 + 1);
}
void build2(int f, int r, int at) {
  if (f == r) {
    a[at] = res[f];
    return;
  }
  int mid = (f + r) >> 1;
  build2(f, mid, at * 2);
  build2(mid + 1, r, at * 2 + 1);
  a[at] = max(a[at * 2 + 1], a[at * 2]);
}
void change2(int f, int r, int at) {
  if (qf == f && f == r) {
    a[at] = to;
    return;
  }
  int mid = (f + r) >> 1;
  if (qf <= mid)
    change2(f, mid, at * 2);
  else
    change2(mid + 1, r, at * 2 + 1);
  a[at] = max(a[at * 2], a[at * 2 + 1]);
}
void query2(int f, int r, int at) {
  if (qf <= f && r <= qr) {
    ans = max(ans, a[at]);
    return;
  }
  int mid = (f + r) >> 1;
  if (qf <= mid) query2(f, mid, at * 2);
  if (qr > mid) query2(mid + 1, r, at * 2 + 1);
}
int main() {
  int i, j, k;
  scanf("%d%d", &n, &m);
  build(1, n, 1);
  for (i = 1; i <= n; i++) res[i] = (int)(1e9) + 2;
  for (i = 1; i <= m; i++) {
    scanf("%d", t + i);
    if (t[i] == 1) {
      scanf("%d%d%d", tf + i, tr + i, x + i);
      qf = tf[i];
      qr = tr[i];
      to = x[i];
      change(1, n, 1);
    } else {
      scanf("%d%d", tf + i, x + i);
      if (res[tf[i]] == (1e9) + 2) {
        qf = tf[i];
        ans = (1e9) + 2;
        query(1, n, 1);
        res[tf[i]] = ans;
      }
    }
  }
  for (i = 1; i <= n; i++)
    if (res[i] == (1e9) + 2) {
      ans = (1e9) + 2;
      qf = i;
      query(1, n, 1);
      res[i] = ans;
    }
  build2(1, n, 1);
  for (i = 1; i <= m; i++) {
    if (t[i] == 1) {
      ans = 0;
      qf = tf[i];
      qr = tr[i];
      query2(1, n, 1);
      if (ans != x[i]) {
        printf("NO");
        return 0;
      }
    } else {
      qf = tf[i];
      to = x[i];
      change2(1, n, 1);
    }
  }
  int tmp, good = 0;
  for (i = 1; i <= n; i++) {
    if (res[i] == (1e9) + 1) continue;
    if (!s.count(res[i])) {
      s.insert(res[i]);
      good |= res[i];
      seq[i] = res[i];
    } else {
      tmp = 1 << 30;
      while (!(res[i] & tmp) && tmp) tmp >>= 1;
      seq[i] = max(0, tmp - 1);
      good |= seq[i];
    }
  }
  int cur;
  for (i = 1; i <= n; i++)
    if (res[i] == (1e9) + 1) {
      tmp = 1 << 30;
      cur = 0;
      while (tmp) {
        if ((tmp & good) == 0 && (tmp | cur) <= 1e9) cur |= tmp;
        tmp >>= 1;
      }
      seq[i] = cur;
      good |= cur;
    }
  printf("YES\n");
  for (i = 1; i <= n; i++) printf("%d ", seq[i]);
  return 0;
}
