#include <bits/stdc++.h>
std::map<int, std::pair<int, std::vector<int> > > MAP;
int N, Q, lim[300001], T[1048577], SIN[1048577], BASE;
void INIT(int p, int l, int r) {
  T[p] = 1000000000;
  SIN[p] = -1;
  if (l < r) {
    int m = (l + r) >> 1;
    INIT(p << 1, l, m);
    INIT(p << 1 | 1, m + 1, r);
  }
}
void P(int p, int l, int r, int L, int R, int w) {
  if (L <= l && r <= R) {
    T[p] = std::min(T[p], w);
    return;
  }
  int m = (l + r) >> 1;
  if (L <= m) P(p << 1, l, m, L, R, w);
  if (R > m) P(p << 1 | 1, m + 1, r, L, R, w);
}
int G(int x) {
  int p = 1, l = 1, r = N, w = T[1];
  while (l < r) {
    int m = (l + r) >> 1;
    if (x <= m)
      p <<= 1, r = m;
    else
      p = p << 1 | 1, l = m + 1;
    w = std::min(w, T[p]);
  }
  return w;
}
void S(int x, int w) {
  int p = 1, l = 1, r = N;
  while (l < r) {
    int m = (l + r) >> 1;
    if (x <= m)
      p <<= 1, r = m;
    else
      p = p << 1 | 1, l = m + 1;
  }
  SIN[p] = w;
  while (p > 1) {
    p >>= 1;
    SIN[p] = std::max(SIN[p << 1], SIN[p << 1 | 1]);
  }
}
int E(int p, int l, int r, int L, int R) {
  if (L <= l && r <= R) return SIN[p];
  int m = (l + r) >> 1;
  if (R <= m) return E(p << 1, l, m, L, R);
  if (L > m) return E(p << 1 | 1, m + 1, r, L, R);
  return std::max(E(p << 1, l, m, L, R), E(p << 1 | 1, m + 1, r, L, R));
}
void L(int p, int l, int r, int H) {
  if (l == r) {
    if (!~lim[l]) lim[l] = H;
    return;
  }
  int m = (l + r) >> 1;
  L(p << 1, l, m, std::min(H, T[p << 1]));
  L(p << 1 | 1, m + 1, r, std::min(H, T[p << 1 | 1]));
}
int main() {
  scanf("%d%d", &N, &Q);
  for (int i = 1; i <= N; i++) lim[i] = -1;
  INIT(1, 1, N);
  while (Q--) {
    int op, l, r, x, w;
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d%d%d", &l, &r, &x);
      int Sin = E(1, 1, N, l, r);
      if (Sin > x) {
        puts("NO");
        return 0;
      }
      if (Sin < x) {
        MAP[x].first--;
        BASE |= x;
      }
      P(1, 1, N, l, r, x);
    } else {
      scanf("%d%d", &x, &w);
      if (lim[x] == -1) lim[x] = G(x);
      S(x, w);
    }
  }
  L(1, 1, N, T[1]);
  for (int i = 1; i <= N; i++) {
    MAP[lim[i]].first++;
    MAP[lim[i]].second.push_back(i);
  }
  for (auto &i : MAP)
    if (i.second.first < 0) {
      puts("NO");
      return 0;
    }
  for (auto &i : MAP)
    if (i.second.first > 1) {
      int baka = 1;
      while (baka < i.first) baka = baka << 1 | 1;
      BASE |= baka;
      lim[i.second.second[0]] = baka >> 1;
      lim[i.second.second[1]] = i.first;
    }
  for (auto &i : MAP)
    if (i.second.first == 1) {
      int tmp = i.first;
      for (int j = 1 << 29; j; j >>= 1)
        if (tmp >= j && !(BASE & j)) tmp -= j;
      lim[i.second.second[0]] = i.first - tmp;
      BASE |= i.first - tmp;
    }
  puts("YES");
  for (int i = 1; i <= N; i++) printf("%d%c", lim[i], " \n"[i == N]);
  return 0;
}
