#include <bits/stdc++.h>
using namespace std;
const pair<int, int> DD[] = {{1, 0},  {1, 1},   {0, 1},  {-1, 1},
                             {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
template <class T>
T smin(T &a, T b) {
  if (a > b) a = b;
  return a;
}
template <class T>
T smax(T &a, T b) {
  if (a < b) a = b;
  return a;
}
int t1[1 << 20];
const int oo = 2e9 + 5;
void build1(int p, int u, int node) {
  t1[node] = oo;
  if (p == u) return;
  int m = (p + u) / 2;
  build1(p, m, node << 1);
  build1(m + 1, u, node << 1 | 1);
}
int t2[1 << 20];
int ans[1 << 20];
void build2(int p, int u, int node) {
  if (p == u)
    t2[node] = ans[p];
  else {
    int m = (p + u) / 2;
    build2(p, m, node << 1);
    build2(m + 1, u, node << 1 | 1);
    t2[node] = max(t2[node << 1], t2[node << 1 | 1]);
  }
}
void update1(int p, int u, int l, int r, int vv, int node) {
  if (l <= p && u <= r)
    smin(t1[node], vv);
  else {
    int m = (p + u) / 2;
    if (l <= m) update1(p, m, l, r, vv, node << 1);
    if (m + 1 <= r) update1(m + 1, u, l, r, vv, node << 1 | 1);
  }
}
void update2(int p, int u, int pos, int vv, int node) {
  if (p == u)
    t2[node] = vv;
  else {
    int m = (p + u) / 2;
    if (pos <= m)
      update2(p, m, pos, vv, node << 1);
    else
      update2(m + 1, u, pos, vv, node << 1 | 1);
    t2[node] = max(t2[node << 1], t2[node << 1 | 1]);
  }
}
int query1(int p, int u, int pos, int node) {
  if (p == u)
    return t1[node];
  else {
    int m = (p + u) / 2;
    if (pos <= m)
      return min(t1[node], query1(p, m, pos, node << 1));
    else
      return min(t1[node], query1(m + 1, u, pos, node << 1 | 1));
  }
}
int query2(int p, int u, int l, int r, int node) {
  if (l <= p && u <= r)
    return t2[node];
  else {
    int m = (p + u) / 2;
    int ans = -oo;
    if (l <= m) smax(ans, query2(p, m, l, r, node << 1));
    if (m + 1 <= r) smax(ans, query2(m + 1, u, l, r, node << 1 | 1));
    return ans;
  }
}
int main(void) {
  srand(time(0));
  cout << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  int n, m;
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) ans[i] = oo;
  build1(1, n, 1);
  vector<vector<int> > edges;
  static int WAS[1 << 20];
  while (m--) {
    int op;
    cin >> op;
    if (op == 1) {
      int l, r, vv;
      cin >> l >> r >> vv;
      edges.push_back({op, l, r, vv});
      update1(1, n, l, r, vv, 1);
    } else {
      int pos, vv;
      cin >> pos >> vv;
      if (!WAS[pos]) WAS[pos] = 1, ans[pos] = query1(1, n, pos, 1);
      edges.push_back({op, pos, vv});
    }
  }
  for (int i = 1; i <= n; ++i)
    if (!WAS[i]) ans[i] = query1(1, n, i, 1);
  build2(1, n, 1);
  for (auto it : edges) {
    if (it[0] == 1) {
      const int L = it[1];
      const int R = it[2];
      const int V = it[3];
      if (query2(1, n, L, R, 1) != V) return puts("NO") * 0;
    } else {
      const int pos = it[1];
      const int V = it[2];
      update2(1, n, pos, V, 1);
    }
  }
  int cnt = 0;
  for (int i = 1; i <= n; ++i) cnt += ans[i] == oo;
  if (cnt >= 2) {
    int ok = 0;
    for (int i = 1; i <= n; ++i)
      if (ans[i] == oo) {
        if (!ok)
          ok = 1, ans[i] = 1e9;
        else
          ans[i] = (1 << 29) - 1;
      }
    cout << "YES\n";
    for (int i = 1; i <= n; ++i) cout << ans[i] << " \n"[i == n];
  } else {
    static map<int, int> M;
    for (int i = 1; i <= n; ++i) ++M[ans[i]];
    int W = 0;
    for (int i = 1; i <= n; ++i)
      if (!(!ans[i] || ans[i] == oo)) {
        --M[ans[i]];
        W |= ans[i];
        if (!M[ans[i]]) continue;
        int lg = -1;
        int tmp = ans[i];
        while (tmp) ++lg, tmp /= 2;
        W |= (1 << lg) - 1;
        ans[i] = (1 << lg) - 1;
      }
    int Next = 0;
    for (int t = 1 << 29; t; t /= 2)
      if (!(W & t) && Next + t <= 1e9) Next += t;
    for (int i = 1; i <= n; ++i)
      if (ans[i] == oo) ans[i] = Next;
    cout << "YES\n";
    for (int i = 1; i <= n; ++i) cout << ans[i] << " \n"[i == n];
  }
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}
