#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 19;
const int INF = 1e9;
using pii = pair<int, int>;
int n, m;
int qa[N], qb[N], qc[N], qd[N];
int upb[N], fixv[N];
bool fixb[N];
pii t[N << 1];
void rangeupdate(int l, int r, int x) {
  for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
    if (l & 1) {
      t[l].first = min(t[l].first, x);
      ++l;
    }
    if (r & 1) {
      --r;
      t[r].first = min(t[r].first, x);
    }
  }
}
int pointquery(int p) {
  int ans = INF;
  for (p += n; p > 0; p >>= 1) ans = min(ans, t[p].first);
  return ans;
}
pii rangequery(int l, int r) {
  pii ans(-1, -1);
  for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
    if (l & 1) ans = max(ans, t[l++]);
    if (r & 1) ans = max(ans, t[--r]);
  }
  return ans;
}
void pointupdate(int p, int x) {
  for (t[p += n].first = x; p >>= 1;) t[p] = max(t[p << 1], t[p << 1 | 1]);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) upb[i] = -1, fixv[i] = -1;
  for (int i = 0; i < n; ++i) t[n + i] = pii(INF, i);
  for (int i = n - 1; i > 0; --i) t[i] = min(t[i << 1], t[i << 1 | 1]);
  for (int i = 0; i < m; ++i) {
    scanf("%d%d%d", &qa[i], &qb[i], &qc[i]);
    if (qa[i] == 1) {
      scanf("%d", &qd[i]);
      --qb[i], --qc[i];
      rangeupdate(qb[i], qc[i], qd[i]);
    } else {
      --qb[i];
      if (upb[qb[i]] == -1) upb[qb[i]] = pointquery(qb[i]);
    }
  }
  for (int i = 0; i < n; ++i)
    if (upb[i] == -1) upb[i] = pointquery(i);
  for (int i = 0; i < n; ++i) t[n + i].first = upb[i];
  for (int i = n - 1; i > 0; --i) t[i] = max(t[i << 1], t[i << 1 | 1]);
  for (int i = 0; i < m; ++i) {
    if (qa[i] == 1) {
      pii mx = rangequery(qb[i], qc[i]);
      if (mx.first == qd[i]) {
        if (!fixb[mx.second] && fixv[mx.second] == -1) {
          fixv[mx.second] = mx.first;
        }
        pointupdate(mx.second, -1);
      } else {
        printf("NO\n");
        exit(0);
      }
    } else {
      pointupdate(qb[i], qc[i]);
      fixb[qb[i]] = true;
    }
  }
  int curor = 0;
  set<pii> second;
  for (int i = 0; i < n; ++i) {
    if (fixv[i] != -1)
      curor |= fixv[i];
    else
      second.emplace(upb[i], i), fixv[i] = 0;
  }
  for (int i = 30; i >= 0; --i) {
    if (curor & (1 << i)) continue;
    auto it = second.lower_bound(pii(1 << i, -1));
    if (it != second.end()) {
      curor |= 1 << i;
      int p = it->second;
      second.erase(it);
      fixv[p] += 1 << i;
      upb[p] -= 1 << i;
      second.emplace(upb[p], p);
    }
  }
  printf("YES\n");
  for (int i = 0; i < n; ++i) {
    if (i != 0) printf(" ");
    printf("%d", fixv[i]);
  }
  return 0;
}
