#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 4;
const int T = 1 << 19;
int g[T + T];
void init() {
  for (int i = 1; i <= T + T - 1; ++i) g[i] = -1e9;
}
void Set(int x, int y) {
  x += T;
  g[x] = y;
  for (x /= 2; x; x /= 2) g[x] = max(g[2 * x], g[2 * x + 1]);
}
int qw(int l, int r) {
  int res = -1e9;
  for (l += T, r += T + 1; l < r; l /= 2, r /= 2) {
    if (l & 1) res = max(res, g[l++]);
    if (r & 1) res = max(res, g[--r]);
  }
  return res;
}
int u[T + T];
void init2() {
  for (int i = 1; i <= T + T - 1; ++i) u[i] = 1e9;
}
void zmin(int l, int r, int x) {
  for (l += T, r += T + 1; l < r; l /= 2, r /= 2) {
    if (l & 1) {
      u[l] = min(u[l], x);
      l++;
    }
    if (r & 1) {
      r--;
      u[r] = min(u[r], x);
    }
  }
}
int bound(int x) {
  int res = 1e9;
  for (x += T; x; x /= 2) res = min(res, u[x]);
  return res;
}
int n, m, z[N], out[N];
struct gao {
  int l, r, x;
};
vector<gao> f;
set<int> S;
void nope() {
  printf("NO\n");
  exit(0);
}
vector<int> bits[30];
map<int, vector<int>> M;
void add(int x, int id) {
  for (int i = 0; i <= 29; ++i)
    if ((x >> i) & 1) bits[i].push_back(id);
}
int main() {
  scanf("%d%d", &n, &m);
  init();
  init2();
  for (int i = 1; i <= m; ++i) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    if (a == 1) {
      int d;
      scanf("%d", &d);
      int e = qw(b, c);
      if (e > d) nope();
      if (e < d) f.push_back({b, c, d});
      zmin(b, c, d);
    } else {
      if (qw(b, b) == -1e9) {
        z[b] = bound(b);
        f.push_back({-1, -1, b});
      }
      Set(b, c);
    }
  }
  for (int i = 1; i <= n; ++i)
    if (qw(i, i) == -1e9) z[i] = bound(i);
  for (int i = 1; i <= n; ++i) M[z[i]].push_back(i);
  int OR = 0;
  for (int i = 1; i <= n; ++i) S.insert(i);
  for (auto a : f) {
    if (a.l == -1) {
      if (S.count(a.x)) {
        add(z[a.x], a.x);
        S.erase(a.x);
      }
      continue;
    }
    bool flag = false;
    for (auto b : M[a.x]) {
      if (a.l <= b && b <= a.r && S.count(b)) {
        flag = true;
        out[b] = a.x;
        OR |= out[b];
        S.erase(b);
        break;
      }
    }
    if (!flag) nope();
  }
  for (auto it : S) add(z[it], it);
  for (int i = 29; 0 <= i; --i) {
    if (bits[i].empty()) continue;
    if ((OR >> i) & 1) {
      int a = bits[i][0];
      out[a] |= (1 << i) - 1;
      break;
    }
    if ((int)bits[i].size() >= 2) {
      int a = bits[i][0], b = bits[i][1];
      out[a] |= (1 << i);
      out[b] |= (1 << i) - 1;
      break;
    }
    int a = bits[i][0];
    out[a] |= (1 << i);
  }
  printf("YES\n");
  for (int i = 1; i <= n; ++i) printf("%d ", out[i]);
  return 0;
}
