#include <bits/stdc++.h>
using namespace std;
int N, M, len, ans;
bool used[300010];
int Max[300010];
set<int> Tim;
class que {
 public:
  int t, x, l, r, d;
} P[300010];
class rec {
 public:
  int x, Max;
} q[300010];
bool cmpMax(const rec &A, const rec &B) { return A.Max > B.Max; }
class segleaf {
 public:
  int mark;
} seg[3000010];
void build(int x, int l, int r) {
  if (l < r) {
    int mid = (l + r) >> 1;
    build(x << 1, l, mid);
    build((x << 1) + 1, mid + 1, r);
  }
  seg[x].mark = 2e9;
}
void mark_down(int x, int l, int r) {
  if (seg[x].mark == 2e9) return;
  if (l < r) {
    seg[x << 1].mark = min(seg[x << 1].mark, seg[x].mark);
    seg[(x << 1) + 1].mark = min(seg[(x << 1) + 1].mark, seg[x].mark);
    seg[x].mark = 2e9;
  }
}
int getMin(int x, int l, int r, int t) {
  mark_down(x, l, r);
  if (l == r) return seg[x].mark;
  int mid = (l + r) >> 1;
  if (t <= mid)
    return getMin(x << 1, l, mid, t);
  else
    return getMin((x << 1) + 1, mid + 1, r, t);
}
void Addi(int x, int l, int r, int ll, int rr, int d) {
  mark_down(x, l, r);
  if (l == ll && r == rr) {
    seg[x].mark = min(seg[x].mark, d);
    return;
  }
  int mid = (l + r) >> 1;
  if (rr <= mid)
    Addi(x << 1, l, mid, ll, rr, d);
  else if (ll > mid)
    Addi((x << 1) + 1, mid + 1, r, ll, rr, d);
  else
    Addi(x << 1, l, mid, ll, mid, d),
        Addi((x << 1) + 1, mid + 1, r, mid + 1, rr, d);
}
void seti(int x, int l, int r, int p, int d) {
  mark_down(x, l, r);
  if (l == r) {
    if (!used[l]) {
      used[l] = 1;
      Max[l] = seg[x].mark;
    }
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    seti(x << 1, l, mid, p, d);
  else
    seti((x << 1) + 1, mid + 1, r, p, d);
}
void build2(int x, int l, int r) {
  if (l < r) {
    int mid = (l + r) >> 1;
    build2(x << 1, l, mid);
    build2((x << 1) + 1, mid + 1, r);
    seg[x].mark = max(seg[x << 1].mark, seg[(x << 1) + 1].mark);
  } else
    seg[x].mark = Max[l];
}
int ask(int x, int l, int r, int ll, int rr) {
  if (l == ll && r == rr) return seg[x].mark;
  int mid = (l + r) >> 1;
  if (rr <= mid)
    return ask(x << 1, l, mid, ll, rr);
  else if (ll > mid)
    return ask((x << 1) + 1, mid + 1, r, ll, rr);
  else
    return max(ask(x << 1, l, mid, ll, mid),
               ask((x << 1) + 1, mid + 1, r, mid + 1, rr));
}
void change(int x, int l, int r, int t, int d) {
  if (l == r) {
    seg[x].mark = d;
    return;
  }
  int mid = (l + r) >> 1;
  if (t <= mid)
    change(x << 1, l, mid, t, d);
  else
    change((x << 1) + 1, mid + 1, r, t, d);
  seg[x].mark = max(seg[x << 1].mark, seg[(x << 1) + 1].mark);
}
bool check() {
  build2(1, 1, N);
  for (int i = 1; i <= M; i++)
    if (P[i].t == 1) {
      if (ask(1, 1, N, P[i].l, P[i].r) != P[i].d) return 0;
    } else {
      change(1, 1, N, P[i].x, P[i].d);
    }
  return 1;
}
int main() {
  scanf("%d%d", &N, &M);
  build(1, 1, N);
  for (int i = 1; i <= M; i++) {
    scanf("%d", &P[i].t);
    if (P[i].t == 1) {
      scanf("%d%d%d", &P[i].l, &P[i].r, &P[i].d);
      Addi(1, 1, N, P[i].l, P[i].r, P[i].d);
    } else {
      scanf("%d%d", &P[i].x, &P[i].d);
      seti(1, 1, N, P[i].x, P[i].d);
    }
  }
  int s = 0;
  for (int i = 1; i <= N; i++)
    if (!used[i]) {
      Max[i] = getMin(1, 1, N, i);
      used[i] = 1;
      if (Max[i] == 2e9) s++;
    }
  if (s > 1) {
    for (int i = 1; i <= N; i++)
      if (Max[i] == 2e9) {
        s--;
        if (!s)
          Max[i] = (1 << 29) - 1;
        else
          Max[i] = 1e9;
      }
  } else {
    len = 0;
    ans = 0;
    Tim.insert(2e9);
    for (int i = 1; i <= N; i++)
      if (Tim.find(Max[i]) == Tim.end()) {
        Tim.insert(Max[i]);
        ans |= Max[i];
      } else {
        ++len;
        q[len].x = i;
        q[len].Max = Max[i];
      }
    sort(q + 1, q + len + 1, cmpMax);
    for (int i = 1; i <= len; i++) {
      if (q[i].Max == 2e9) q[i].Max = 1e9;
      int x = 0;
      for (int j = 29; j >= 0; j--)
        if (((ans >> j) & 1) == 0) {
          if ((x | (1 << j)) <= q[i].Max) x |= 1 << j;
        }
      Max[q[i].x] = x;
      ans |= x;
    }
  }
  if (check()) {
    printf("YES\n");
    for (int i = 1; i <= N; i++) {
      printf("%d", Max[i]);
      if (i < N)
        printf(" ");
      else
        printf("\n");
    }
  } else
    printf("NO");
}
