#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x += _y;
  return _x >= _mod ? _x - _mod : _x;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x -= _y;
  return _x < 0 ? _x + _mod : _x;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x *= _y;
  return _x >= _mod ? _x % _mod : _x;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1LL;
  long long _ret = mypow(mul(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = mul(_ret, _a, _mod);
  return _ret;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0LL;
  long long _ret = mymul(add(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = add(_ret, _a, _mod);
  return _ret;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
const int inf = 1000000000;
int st[303030 << 2], tg[303030 << 2];
void build_st(int no, int l, int r) {
  st[no] = tg[no] = inf + 1;
  if (l == r) return;
  build_st((no << 1), l, ((l + r) >> 1));
  build_st((1 + (no << 1)), ((l + r) >> 1) + 1, r);
}
void push(int no, int l, int r) {
  if (tg[no] == inf + 1) return;
  st[(no << 1)] = min(st[(no << 1)], tg[no]);
  st[(1 + (no << 1))] = min(st[(1 + (no << 1))], tg[no]);
  tg[(no << 1)] = min(tg[(no << 1)], tg[no]);
  tg[(1 + (no << 1))] = min(tg[(1 + (no << 1))], tg[no]);
  tg[no] = inf + 1;
}
void modify(int no, int l, int r, int ql, int qr, int qv) {
  if (r < ql or l > qr) return;
  if (ql <= l and r <= qr) {
    st[no] = min(st[no], qv);
    tg[no] = min(tg[no], qv);
    return;
  }
  push(no, l, r);
  modify((no << 1), l, ((l + r) >> 1), ql, qr, qv);
  modify((1 + (no << 1)), ((l + r) >> 1) + 1, r, ql, qr, qv);
  st[no] = max(st[(no << 1)], st[(1 + (no << 1))]);
}
int query(int no, int l, int r, int ql, int qr) {
  if (r < ql or l > qr) return 0;
  if (ql <= l and r <= qr) return st[no];
  push(no, l, r);
  return max(query((no << 1), l, ((l + r) >> 1), ql, qr),
             query((1 + (no << 1)), ((l + r) >> 1) + 1, r, ql, qr));
}
int st2[303030 << 2];
void modify2(int no, int l, int r, int p, int v) {
  if (l == r) {
    st2[no] = v;
    return;
  }
  if (p <= ((l + r) >> 1))
    modify2((no << 1), l, ((l + r) >> 1), p, v);
  else
    modify2((1 + (no << 1)), ((l + r) >> 1) + 1, r, p, v);
  st2[no] = max(st2[(no << 1)], st2[(1 + (no << 1))]);
}
int query2(int no, int l, int r, int ql, int qr) {
  if (r < ql or l > qr) return 0;
  if (ql <= l and r <= qr) return st2[no];
  return max(query2((no << 1), l, ((l + r) >> 1), ql, qr),
             query2((1 + (no << 1)), ((l + r) >> 1) + 1, r, ql, qr));
}
void build() {}
int n, m;
void init() {
  n = getint();
  m = getint();
}
bool fix[303030];
int a[303030];
void no() {
  puts("NO");
  exit(0);
}
bool ff[303030];
void solve() {
  set<int> nd;
  build_st(1, 1, n);
  while (m--) {
    int ti = getint();
    if (ti == 1) {
      int li = getint();
      int ri = getint();
      int xi = getint();
      int vl1 = query(1, 1, n, li, ri);
      int vl2 = query2(1, 1, n, li, ri);
      if (vl2 > xi) no();
      if (vl1 < xi and vl2 < xi) no();
      modify(1, 1, n, li, ri, xi);
      if (vl2 < xi) nd.insert(xi);
    } else {
      int ki = getint();
      int di = getint();
      if (not fix[ki]) a[ki] = query(1, 1, n, ki, ki);
      fix[ki] = true;
      modify2(1, 1, n, ki, di);
    }
  }
  for (int i = 1; i <= n; i++)
    if (not fix[i]) a[i] = query(1, 1, n, i, i);
  int tans = 0;
  for (int i = 1; i <= n; i++)
    if (nd.count(a[i])) {
      nd.erase(a[i]);
      ff[i] = true;
      tans |= a[i];
    }
  if (nd.size()) no();
  vector<pair<int, int> > v;
  for (int i = 1; i <= n; i++) {
    if (ff[i]) continue;
    a[i] = min(a[i], inf);
    v.push_back({a[i], i});
  }
  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  for (auto _ : v) {
    int i = _.second;
    int cc = 0;
    for (int b = 29; b >= 0; b--)
      if (((tans >> b) & 1) == 0 and (cc | (1 << b)) <= a[i]) cc |= (1 << b);
    a[i] = cc;
    tans |= cc;
  }
  cerr << tans << endl;
  puts("YES");
  for (int i = 1; i <= n; i++) printf("%d%c", a[i], " \n"[i == n]);
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
