#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int INF = 2000000000;
const long long BIG = 1446803456761533460LL;
const int maxn = 300010;
const int MAX = 1000000000;
const int maxnlg = 30;
int n, m;
bool notsat[maxn], modify[maxn], chg[maxn];
int cnt[maxn], dup[maxn], dn;
pair<int, int> res[maxn];
struct Segment1 {
  pair<int, int> seg[maxn * 2];
  void build() { fill(seg, seg + maxn * 2, make_pair(MAX, m)); }
  void update(int l, int r, pair<int, int> v) {
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) seg[l] = min(seg[l], (v)), ++l;
      if (r & 1) --r, seg[r] = min(seg[r], (v));
    }
  }
  pair<int, int> get(int p) {
    pair<int, int> res = {MAX, m};
    for (p += n; p; p >>= 1) res = min(res, (seg[p]));
    return res;
  }
} seg1;
struct Segment2 {
  int seg[maxn * 2];
  void update(int p, int v) {
    seg[p += n] = v;
    for (p >>= 1; p; p >>= 1) seg[p] = max(seg[p << 1], seg[p << 1 ^ 1]);
  }
  int get(int l, int r) {
    int res = 0;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) res = max(res, (seg[l++]));
      if (r & 1) res = max(res, (seg[--r]));
    }
    return res;
  }
} seg2;
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  seg1.build();
  for (int i = 0; i < m; ++i) {
    int t;
    cin >> t;
    if (t == 1) {
      int l, r, x;
      cin >> l >> r >> x;
      --l;
      int v = seg2.get(l, r);
      if (v > x)
        return cout << "NO\n", 0;
      else if (v < x)
        notsat[i] = 1;
      seg1.update(l, r, {x, i});
    } else {
      int k, d;
      cin >> k >> d;
      --k;
      if (!modify[k]) modify[k] = 1, res[k] = seg1.get(k);
      seg2.update(k, d);
    }
  }
  cnt[m] = INF;
  for (int i = 0; i < n; ++i) {
    if (!modify[i]) res[i] = seg1.get(i);
    if (res[i].second < m) ++cnt[res[i].second];
  }
  for (int i = 0; i < m; ++i)
    if (notsat[i] && cnt[i] == 0) return cout << "NO\n", 0;
  for (int i = 0; i < n; ++i) {
    if (cnt[res[i].second] >= 2 || !notsat[res[i].second])
      dup[dn++] = i, chg[i] = 1;
  }
  sort(dup, dup + dn, [](int a, int b) { return res[a].first > res[b].first; });
  int cute = 0;
  for (int i = 0; i < n; ++i)
    if (res[i].second < m) cute |= res[i].first;
  for (int i = 0; i < dn; ++i) {
    int ii = dup[i];
    if (cnt[res[ii].second]-- <= 1) continue;
    int v = 0;
    for (int b = (maxnlg)-1; b >= 0; --b) {
      if (!(cute >> b & 1) && res[ii].first >= (v ^ 1 << b))
        v ^= 1 << b, cute ^= 1 << b;
    }
    res[ii].first = v;
  }
  cout << "YES\n";
  for (int i = 0; i < n; ++i) cout << res[i].first << ' ';
  cout << '\n';
}
