Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- using namespace std;
- const int N = (int)(1e5 + 100);
- int shr;
- int t[4 * N], n, m, L[N], R[N], Q[N], used[4 * N];
- void into(int v)
- {
- if(!used[v]) return;
- else if(used[v])
- {
- used[v] = 0;
- used[v + v] = used[v + v + 1] = 1;
- t[v + v] |= t[v], t[v + v + 1] |= t[v];
- }
- }
- void update(int v, int tl, int tr, int l, int r, int x)
- {
- if(l > r)
- return;
- if(tl == l && tr == r)
- {
- // cerr << l << ' ' << r << ' ' << t[v] << ' ' << (t[v] | x) << endl;
- t[v] |= x;
- used[v] = 1;
- return;
- }
- into(v);
- int mid = (tl + tr) / 2;
- update(v + v, tl, mid, l, min(r, mid), x);
- update(v + v + 1, mid + 1, tr, max(l, mid + 1), r, x);
- t[v] = t[v + v] & t[v + v + 1];
- }
- int getand(int v, int tl, int tr, int l, int r)
- {
- if(l <= r)
- {
- if(tl == l && tr == r)
- return t[v];
- int mid = (tl + tr) / 2;
- into(v);
- // cerr << l << ' ' << r << ' ' << tl << ' ' << tr << ' ' << getand(v + v, tl, mid, l, min(r, mid)) << ' ' << getand(v + v + 1, mid + 1, tr, max(l, mid + 1), r) << endl;
- return getand(v + v, tl, mid, l, min(r, mid)) & getand(v + v + 1, mid + 1, tr, max(l, mid + 1), r);
- }
- return shr;
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> m;
- shr = (1 << 31) - 1;
- for(int i = 0; i < m; ++i)
- {
- cin >> L[i] >> R[i] >> Q[i];
- update(1, 1, n, L[i], R[i], Q[i]);
- }
- for(int i = 0; i < m; ++i)
- if(getand(1, 1, n, L[i], R[i]) != Q[i])
- {
- cout << "NO";
- return 0;
- }
- cout << "YES\n";
- for(int i = 1; i <= n; ++i)
- {
- cout << getand(1, 1, n, i, i) << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement