#include <bits/stdc++.h>
using namespace std;
struct segtree2 {
  int seg[512 * 1024 * 2];
  int mum;
  void init(int n) {
    mum = 1;
    while (mum < n) mum <<= 1;
    for (int i = 0; i < mum * 2; i++) seg[i] = -1;
  }
  void add(int k, int x) {
    k += mum - 1;
    seg[k] = x;
    while (k > 0) {
      k = (k - 1) / 2;
      seg[k] = max(seg[k * 2 + 1], seg[k * 2 + 2]);
    }
  }
  int get(int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) return -1;
    if (a <= l && r <= b)
      return seg[k];
    else {
      int vl = get(a, b, k * 2 + 1, l, (l + r) / 2);
      int vr = get(a, b, k * 2 + 2, (l + r) / 2, r);
      return max(vl, vr);
    }
  }
  int get(int a, int b) { return get(a, b, 0, 0, mum); }
};
struct segtree1 {
  int seg[512 * 1024 * 2];
  int mum;
  void init(int n) {
    mum = 1;
    while (mum < n) mum <<= 1;
    for (int i = 0; i < mum * 2; i++) seg[i] = 1000000005;
  }
  void update(int a, int b, int k, int l, int r, int v) {
    if (b <= l || r <= a) return;
    if (a <= l && r <= b)
      seg[k] = min(seg[k], v);
    else {
      update(a, b, k * 2 + 1, l, (l + r) / 2, v);
      update(a, b, k * 2 + 2, (l + r) / 2, r, v);
    }
  }
  void update(int a, int b, int v) { update(a, b, 0, 0, mum, v); }
  void pass(int k) {
    seg[k * 2 + 1] = min(seg[k * 2 + 1], seg[k]);
    seg[k * 2 + 2] = min(seg[k * 2 + 2], seg[k]);
    seg[k] = 1000000005;
  }
  void erase(int x) {
    int l = 0, r = mum, k = 0;
    while (l + 1 < r) {
      pass(k);
      int m = (l + r) / 2;
      if (x < m) {
        r = m;
        k = k * 2 + 1;
      } else {
        l = m;
        k = k * 2 + 2;
      }
    }
    seg[k] = 1000000005;
  }
  int get(int k) {
    k += mum - 1;
    int ret = seg[k];
    while (k > 0) {
      k = (k - 1) / 2;
      ret = min(ret, seg[k]);
    }
    return ret;
  }
};
segtree1 s1;
segtree2 s2;
int L[300005], R[300005], X[300005];
int pos[300005], dt[300005];
int tp[300005];
int mx[300005], nowA[300005];
set<int> st[300005];
set<int>::iterator it;
vector<int> vec[40];
bool use[300005];
bool ng[300005];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  s1.init(n + 2);
  s2.init(n + 2);
  memset(nowA, -1, sizeof(nowA));
  memset(use, false, sizeof(use));
  for (int i = 0; i < m; i++) {
    scanf("%d", &tp[i]);
    if (tp[i] == 1) {
      scanf("%d %d %d", &L[i], &R[i], &X[i]);
      L[i]--, R[i]--;
      s1.update(L[i], R[i] + 1, X[i]);
      int gt = s2.get(L[i], R[i] + 1);
      if (gt > X[i]) {
        puts("NO");
        return 0;
      }
      use[i] = gt == X[i];
    } else {
      scanf("%d %d", &pos[i], &dt[i]);
      pos[i]--;
      int gt = s1.get(pos[i]);
      gt = min(gt, 1000000000);
      if (nowA[pos[i]] == -1) mx[pos[i]] = gt;
      nowA[pos[i]] = dt[i];
      s2.add(pos[i], dt[i]);
    }
  }
  for (int i = 0; i < n; i++) {
    if (nowA[i] == -1) {
      mx[i] = s1.get(i);
      mx[i] = min(mx[i], 1000000000);
    }
  }
  vector<int> vx;
  for (int i = 0; i < n; i++) vx.push_back(mx[i]);
  sort(vx.begin(), vx.end());
  vx.erase(unique(vx.begin(), vx.end()), vx.end());
  for (int i = 0; i < n; i++) {
    mx[i] = lower_bound(vx.begin(), vx.end(), mx[i]) - vx.begin();
    st[mx[i]].insert(i);
  }
  for (int i = 0; i < m; i++) {
    if (tp[i] == 1 && !use[i]) {
      int t = lower_bound(vx.begin(), vx.end(), X[i]) - vx.begin();
      if (t == vx.size() || vx[t] != X[i]) {
        puts("NO");
        return 0;
      }
      it = st[t].lower_bound(L[i]);
      if (it == st[t].end() || *it > R[i]) {
        puts("NO");
        return 0;
      }
      int to = *it;
      it++;
      if (it == st[t].end() || *it > R[i]) {
        ng[to] = true;
      }
    } else {
      int v = pos[i];
      st[mx[v]].erase(v);
    }
  }
  for (int i = 0; i < n; i++) {
    mx[i] = vx[mx[i]];
    int vl = mx[i];
    if (vl > 0) {
      int cnt = 0;
      while (vl > 0) {
        vl /= 2;
        cnt++;
      }
      vec[cnt - 1].push_back(i);
    }
  }
  int ret = 0;
  for (int i = 40 - 1; i >= 0; i--) {
    if (vec[i].empty()) continue;
    if (ret >> i & 1) {
      bool U = true;
      for (int j = 0; j < vec[i].size(); j++) {
        int v = vec[i][j];
        if (!ng[v] && U) {
          mx[v] = ((mx[v] >> (i + 1)) << (i + 1)) + (1 << i) - 1;
          U = false;
        }
        ret |= mx[v];
      }
      if (!U) break;
    } else {
      if (vec[i].size() == 1) {
        int v = vec[i][0];
        if (!ng[v]) {
          int zan = mx[v] - ((mx[v] >> i) << i);
          ret |= 1 << i;
          if (zan > 0) {
            int vl = zan, cnt = 0;
            while (vl > 0) {
              vl /= 2;
              cnt++;
            }
            vec[cnt - 1].push_back(v);
          }
        } else
          ret |= mx[v];
      } else {
        bool up = false;
        for (int j = 0; j < vec[i].size(); j++) {
          int v = vec[i][j];
          up |= !ng[v];
        }
        if (up) {
          for (int j = 0; j < vec[i].size(); j++) {
            int v = vec[i][j];
            if (!ng[v]) {
              mx[v] = ((mx[v] >> (i + 1)) << (i + 1)) + (1 << i) - 1;
              break;
            }
          }
          ret |= (1 << (i + 1)) - 1;
          break;
        } else {
          for (int j = 0; j < vec[i].size(); j++) {
            int v = vec[i][j];
            ret |= mx[v];
          }
        }
      }
    }
  }
  puts("YES");
  for (int i = 0; i < n; i++) {
    if (i != 0) printf(" ");
    printf("%d", mx[i]);
  }
  puts("");
  return 0;
}
