#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300001;
const int MAXV = 1000000000;
const int MAXTSIZE = 1 << 20;
const int MAXBSIZE = 30;
int n, BASE;
int Q[MAXN][4];
int tr[MAXN * 2], tr2[MAXTSIZE];
int b[MAXN];
map<int, int> mp;
int sgmvpos;
void Update(int l, int r, int v) {
  l += n;
  r += n + 1;
  for (; l < r; l >>= 1, r >>= 1) {
    if (l & 1) tr[l] = min(tr[l], v), l++;
    if (r & 1) r--, tr[r] = min(tr[r], v);
  }
  return;
}
int Query(int x) {
  int ret = MAXV;
  x += n;
  while (x > 0) ret = min(ret, tr[x]), x >>= 1;
  return ret;
}
void Update2(int x, int v) {
  x += BASE;
  tr2[x] = v;
  x >>= 1;
  while (x > 0) tr2[x] = max(tr2[x * 2 + 0], tr2[x * 2 + 1]), x >>= 1;
  return;
}
int Query2(int l, int r) {
  int ret = -1;
  l += BASE;
  r += BASE + 1;
  for (; l < r; l >>= 1, r >>= 1) {
    if (l & 1) ret = max(ret, tr2[l]), l++;
    if (r & 1) r--, ret = max(ret, tr2[r]);
  }
  return ret;
}
int GetMaxBitPos(int x) {
  int ret = -1;
  while (x) ret++, x >>= 1;
  return ret;
}
int main() {
  int m;
  memset(b, -1, sizeof(b));
  BASE = 1;
  sgmvpos = -1;
  scanf("%d%d", &n, &m);
  while (BASE <= n) BASE <<= 1;
  for (int i = 0; i <= 2 * n; ++i) tr[i] = MAXV;
  for (int i = 0; i < (BASE << 1); ++i) tr2[i] = MAXV;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d%d", &Q[i][0], &Q[i][1], &Q[i][2]);
    if (Q[i][0] == 1) {
      scanf("%d", &Q[i][3]);
      Update(Q[i][1], Q[i][2], Q[i][3]);
      if (Q[i][3] == MAXV && Q[i][1] == Q[i][2]) sgmvpos = Q[i][1];
    } else {
      if (b[Q[i][1]] == -1) b[Q[i][1]] = Query(Q[i][1]);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (b[i] == -1) b[i] = Query(i);
    Update2(i, b[i]);
  }
  for (int i = 0; i < m; ++i) {
    if (Q[i][0] == 1) {
      if (Query2(Q[i][1], Q[i][2]) != Q[i][3]) {
        printf("NO\n");
        return 0;
      }
    } else
      Update2(Q[i][1], Q[i][2]);
  }
  for (int i = 1; i <= n; ++i) mp[b[i]]++;
  if (mp[MAXV] > 1) {
    for (int i = 1; i <= n; ++i)
      if (b[i] == MAXV && sgmvpos != i) {
        b[i] = (1 << (MAXBSIZE - 1)) - 1;
        break;
      }
  } else {
    int t = 0, res = 0;
    for (int i = 1; i <= n; ++i)
      if (b[i] > 0 && b[i] != MAXV) {
        mp[b[i]]--;
        if (mp[b[i]] > 0) b[i] = (1 << GetMaxBitPos(b[i])) - 1;
        res |= b[i];
      }
    for (int i = MAXBSIZE - 1; i >= 0; --i)
      if ((res & (1 << i)) == 0 && (t + (1 << i)) <= MAXV) t += (1 << i);
    for (int i = 1; i <= n; ++i)
      if (b[i] == MAXV && sgmvpos != i) b[i] = t;
  }
  printf("YES\n");
  for (int i = 1; i <= n; ++i) printf("%d ", b[i]);
  return 0;
}
