#include <bits/stdc++.h>
using namespace std;
int n, m, *dot, inf = 2e9, bg = 1e9, lg, rg, add, *ar;
bool er = 0;
void push(int nu) {
  dot[nu * 2] = min(dot[nu * 2], dot[nu]);
  dot[nu * 2 + 1] = min(dot[nu * 2 + 1], dot[nu]);
  dot[nu] = inf;
}
void cha(int nu, int l, int r) {
  if (l >= lg and r <= rg)
    dot[nu] = min(dot[nu], add);
  else if (!(l > rg or r < lg)) {
    int mid = (l + r) / 2;
    push(nu);
    cha(nu * 2, l, mid);
    cha(nu * 2 + 1, mid + 1, r);
  }
}
int que(int nu, int l, int r) {
  if (l == r)
    return dot[nu];
  else {
    int mid = (l + r) / 2;
    push(nu);
    if (lg <= mid)
      return que(nu * 2, l, mid);
    else
      return que(nu * 2 + 1, mid + 1, r);
  }
}
void recalc(int nu) { dot[nu] = max(dot[nu * 2], dot[nu * 2 + 1]); }
void build(int nu, int l, int r) {
  if (l == r)
    dot[nu] = ar[l];
  else {
    int mid = (l + r) / 2;
    build(nu * 2, l, mid);
    build(nu * 2 + 1, mid + 1, r);
    recalc(nu);
  }
}
void cha2(int nu, int l, int r) {
  if (l == r)
    dot[nu] = add;
  else {
    int mid = (l + r) / 2;
    if (lg <= mid)
      cha2(nu * 2, l, mid);
    else
      cha2(nu * 2 + 1, mid + 1, r);
    recalc(nu);
  }
}
int que2(int nu, int l, int r) {
  if (l >= lg and r <= rg)
    return dot[nu];
  else if (l > rg or r < lg)
    return 0;
  else {
    int mid = (l + r) / 2;
    int an = max(que2(nu * 2, l, mid), que2(nu * 2 + 1, mid + 1, r));
    recalc(nu);
    return an;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  dot = new int[n * 4], ar = new int[n];
  int za[m][4];
  bool us[n];
  for (int a = 0; a < n * 4; a++) dot[a] = inf;
  for (int a = 0; a < n; a++) {
    ar[a] = inf, us[a] = 0;
  }
  for (int a = 0; a < m; a++) {
    scanf("%d", &za[a][0]);
    if (za[a][0] == 1) {
      for (int b = 1; b < 4; b++) scanf("%d", &za[a][b]);
      za[a][1]--, za[a][2]--;
      lg = za[a][1], rg = za[a][2], add = za[a][3];
      cha(1, 0, n - 1);
    } else {
      for (int b = 1; b < 3; b++) scanf("%d", &za[a][b]);
      za[a][1]--;
      lg = za[a][1];
      if (us[lg] == 0) {
        ar[lg] = que(1, 0, n - 1);
        us[lg] = 1;
      }
    }
  }
  for (lg = 0; lg < n; lg++) {
    if (us[lg] == 0) ar[lg] = que(1, 0, n - 1);
  }
  build(1, 0, n - 1);
  for (int a = 0; a < m; a++) {
    if (za[a][0] == 1) {
      lg = za[a][1], rg = za[a][2];
      int an = que2(1, 0, n - 1);
      if (za[a][3] != an) er = 1;
    } else {
      lg = za[a][1], add = za[a][2];
      cha2(1, 0, n - 1);
    }
  }
  if (er)
    printf("NO");
  else {
    printf("YES\n");
    map<int, vector<int> > ma;
    for (int a = 0; a < n; a++) {
      ma[ar[a]].push_back(a);
      if (ar[a] == inf) ar[a] = bg;
    }
    if (ma[inf].size() > 1) {
      int nu = ma[inf][0];
      ar[nu] = (1 << 29) - 1;
    } else {
      if (ma[inf].size() == 0) ma.erase(inf);
      int an = 0;
      for (map<int, vector<int> >::iterator it = ma.begin(); it != ma.end();
           it++) {
        int va = (*it).first, nu = (*it).second[0];
        if (va == inf) {
          va = 0;
          for (int b = 29; b >= 0; b--) {
            int ne = (1 << b);
            if ((an & ne) == 0) {
              if (va + ne <= bg) va += ne;
            }
          }
          an = (an | va);
          ar[nu] = va;
        } else {
          an = (an | va);
          if ((*it).second.size() > 1) {
            for (int b = 29; b >= 1; b--) {
              int ne = (1 << b) - 1;
              if (va >= ne) {
                ar[nu] = ne, an = (an | ne);
                break;
              }
            }
          }
        }
      }
    }
    for (int a = 0; a < n; a++) printf("%d ", ar[a]);
  }
}
