#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
const int INF = 1e9 + 3;
int n, m, maxi[maxn], maxx[4 * maxn], tq[maxn], lq[maxn], rq[maxn], xq[maxn],
    kq[maxn], dq[maxn], minn[4 * maxn];
map<int, int> cnt;
bool endd[maxn];
void up1(int x, int y, int va, int l = 1, int r = n, int node = 1) {
  if (l > y || r < x) return;
  if (l >= x && r <= y) {
    minn[node] = min(minn[node], va);
    return;
  }
  int mid = (r + l) / 2;
  up1(x, y, va, l, mid, 2 * node);
  up1(x, y, va, mid + 1, r, (2 * node) + 1);
}
int qu1(int x, int y, int l = 1, int r = n, int node = 1) {
  if (l > y || r < x) return INF;
  int now = minn[node];
  if (l >= x && r <= y) return now;
  int mid = (r + l) / 2;
  now = min(now, qu1(x, y, mid + 1, r, (2 * node) + 1));
  now = min(now, qu1(x, y, l, mid, 2 * node));
  return now;
}
void build(int l = 1, int r = n, int node = 1) {
  if (l == r) {
    maxx[node] = maxi[l];
    return;
  }
  int mid = (r + l) / 2;
  build(l, mid, 2 * node);
  build(mid + 1, r, (2 * node) + 1);
  maxx[node] = max(maxx[2 * node], maxx[(2 * node) + 1]);
}
void up(int x, int y, int va, int l = 1, int r = n, int node = 1) {
  if (l > y || r < x) return;
  if (l >= x && r <= y) {
    maxx[node] = va;
    return;
  }
  int mid = (r + l) / 2;
  up(x, y, va, l, mid, 2 * node);
  up(x, y, va, mid + 1, r, (2 * node) + 1);
  maxx[node] = max(maxx[2 * node], maxx[(2 * node) + 1]);
}
int getmax(int x, int y, int l = 1, int r = n, int node = 1) {
  if (l > y || r < x)
    return 0;
  else if (l >= x && r <= y)
    return maxx[node];
  int mid = (r + l) / 2;
  return max(getmax(x, y, l, mid, 2 * node),
             getmax(x, y, mid + 1, r, (2 * node) + 1));
}
int main() {
  std::ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= 4 * n; i++) minn[i] = INF;
  for (int i = 1; i <= n; i++) maxi[i] = INF, endd[i] = false;
  for (int i = 1; i <= m; i++) {
    cin >> tq[i];
    if (tq[i] == 1) {
      cin >> lq[i] >> rq[i] >> xq[i];
      up1(lq[i], rq[i], xq[i]);
    } else {
      cin >> kq[i] >> dq[i];
      if (!endd[kq[i]]) {
        endd[kq[i]] = true;
        maxi[kq[i]] = qu1(kq[i], kq[i]);
      }
    }
  }
  for (int i = 1; i <= n; i++)
    if (!endd[i]) maxi[i] = qu1(i, i);
  build();
  for (int i = 1; i <= m; i++) {
    if (tq[i] == 1) {
      if (getmax(lq[i], rq[i]) != xq[i]) return cout << "NO", 0;
    } else {
      up(kq[i], kq[i], dq[i]);
    }
  }
  for (int i = 1; i <= n; i++) cnt[maxi[i]]++;
  int anskol = 0;
  for (int i = 1; i <= n; i++) {
    if (maxi[i] == INF || maxi[i] == 0) continue;
    cnt[maxi[i]]--;
    if (cnt[maxi[i]]) {
      int bit = log2(maxi[i]);
      maxi[i] = (1 << bit) - 1;
    }
    anskol |= maxi[i];
  }
  int rest = 0;
  for (int i = 1; i <= n; i++) {
    if (maxi[i] != INF) continue;
    maxi[i] = 0;
    for (int j = 29; j >= 0; j--) {
      if (anskol & (1 << j)) continue;
      if (maxi[i] + (1 << j) > (1e9)) continue;
      maxi[i] += (1 << j);
    }
    anskol |= maxi[i];
  }
  cout << "YES"
       << "\n";
  for (int i = 1; i <= n; i++) cout << maxi[i] << " ";
  return 0;
}
