#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, m, a[N], seg[4 * N], mn[4 * N], ans[N];
vector<int> qs[N];
unordered_map<int, int> mp;
bool fix[N];
struct Q {
  int t, l, r, o;
  Q() : t(-1), l(-1), r(-1), o(-1) {}
  Q(int t, int l, int r, int o) : t(t), l(l), r(r), o(o) {}
} q[N];
void shift(int id) {
  mn[2 * id] = min(mn[2 * id], mn[id]);
  mn[2 * id + 1] = min(mn[2 * id + 1], mn[id]);
}
void updmin(int l, int r, int val, int s = 0, int e = n, int id = 1) {
  if (e <= l || r <= s) return;
  if (l <= s && e <= r) {
    mn[id] = min(mn[id], val);
    return;
  }
  int mid = (s + e) / 2;
  shift(id);
  updmin(l, r, val, s, mid, 2 * id);
  updmin(l, r, val, mid, e, 2 * id + 1);
}
int getmin(int x, int s = 0, int e = n, int id = 1) {
  if (x < s || x >= e) return 1e9 + 1;
  if (e - s == 1) return mn[id];
  shift(id);
  int mid = (s + e) / 2;
  return min(getmin(x, s, mid, 2 * id), getmin(x, mid, e, 2 * id + 1));
}
void build(int s = 0, int e = n, int id = 1) {
  if (e - s == 1) {
    seg[id] = a[s];
    return;
  }
  int mid = (s + e) / 2;
  build(s, mid, 2 * id);
  build(mid, e, 2 * id + 1);
  seg[id] = max(seg[2 * id], seg[2 * id + 1]);
}
void upd(int x, int val, int s = 0, int e = n, int id = 1) {
  if (x >= e || x < s) return;
  if (e - s == 1) {
    seg[id] = val;
    return;
  }
  int mid = (s + e) / 2;
  upd(x, val, s, mid, 2 * id);
  upd(x, val, mid, e, 2 * id + 1);
  seg[id] = max(seg[2 * id], seg[2 * id + 1]);
}
int get(int l, int r, int s = 0, int e = n, int id = 1) {
  if (r <= s || e <= l) return -1;
  if (l <= s && e <= r) return seg[id];
  int mid = (s + e) / 2;
  return max(get(l, r, s, mid, 2 * id), get(l, r, mid, e, 2 * id + 1));
}
void red_button() {
  puts("NO");
  exit(0);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) a[i] = 1e9 + 1;
  fill(mn, mn + 4 * N, 1e9 + 1);
  for (int i = 0; i < m; i++) {
    int t, l, r, o;
    scanf("%d", &t);
    if (t == 1)
      scanf("%d%d%d", &l, &r, &o);
    else
      scanf("%d%d", &l, &o);
    l--;
    q[i] = Q(t, l, r, o);
    if (t == 1)
      updmin(l, r, o);
    else if (!fix[l]) {
      fix[l] = true;
      a[l] = getmin(l);
    }
  }
  for (int i = 0; i < n; i++) {
    if (!fix[i]) a[i] = getmin(i);
  }
  build();
  int cut = 0;
  for (int i = 0; i < m; i++) {
    if (q[i].t == 1 && get(q[i].l, q[i].r) != q[i].o)
      red_button();
    else if (q[i].t == 2)
      upd(q[i].l, q[i].o);
  }
  puts("YES");
  a[n] = -(1e9 + 1);
  mp[1e9 + 1]++;
  set<pair<int, int> > st;
  for (int i = 0; i < n; i++) {
    mp[a[i]]++;
    if (mp[a[i]] == 1) {
      cut |= a[i];
      ans[i] = a[i];
    } else
      st.insert(pair<int, int>(min(a[i], 1000 * 1000 * 1000), i));
  }
  int cur = (1 << 30) - 1;
  cur ^= cut;
  for (int i = 30; i >= 0; i--) {
    if (((1 << i) & cur) == 0) continue;
    if ((int)st.size() == 0) continue;
    if ((1 << i) <= st.rbegin()->first) {
      pair<int, int> p = *st.rbegin();
      st.erase(p);
      ans[p.second] += (1 << i);
      p.first -= (1 << i);
      st.insert(p);
    }
  }
  for (int i = 0; i < n; i++) printf("%d ", ans[i]);
  puts("");
  return 0;
}
