#include <bits/stdc++.h> struct Tree { Tree *lc,*rc; int l,r; int v,lazy; Tree(int l=0,int r=0) :l(l),r(r),v(0),lazy(0) {} void build() { if (l == r) return ; int mid = l+r>>1; lc = new Tree(l,mid); rc = new Tree(mid+1,r); lc->build(); rc->build(); } void modify(int x,int L,int R) { if (L<=l && r<=R) { v |= x; lazy |= x; return ; } if (R<l || r<L) return ; down(); lc->modify(x,L,R); rc->modify(x,L,R); v = lc->v & rc->v; } void down() { if (lazy == 0) return ; lc->lazy |= lazy; lc->v |= lazy; rc->lazy |= lazy; rc->v |= lazy; lazy = 0; } int query(int L,int R) { if (L<=l && r<=R) return v; if (R<l || r<L) return (1ll<<31)-1; down(); return lc->query(L,R) & rc->query(L,R); } void show() { if (l == r) { printf("%d ",v); return ; } down(); lc->show(); rc->show(); } }; const int N = 100000 + 5; int n,m; int L[N],R[N],Q[N]; int main() { scanf("%d%d",&n,&m); Tree *tree = new Tree(1,n); tree->build(); for (int i = 0; i < m; ++ i) { scanf("%d%d%d",L+i,R+i,Q+i); tree->modify(Q[i],L[i],R[i]); } for (int i = 0; i < m; ++ i) { if (tree->query(L[i],R[i]) != Q[i]) { puts("NO"); return 0; } } puts("YES"); tree->show(); puts(""); return 0; }
by 铭神
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; typedef __int64 ll; const int MOD = (int)1e9+7; const int N = 100000+5; struct Segtree { #define lson rt<<1, l, mid #define rson rt<<1|1, mid+1, r int node[N<<2], mark[N<<2]; void down(int rt) { if(mark[rt]) { mark[rt<<1] |= mark[rt]; mark[rt<<1|1] |= mark[rt]; node[rt<<1] |= mark[rt]; node[rt<<1|1] |= mark[rt]; mark[rt] = 0; } } void up(int rt) { node[rt] = node[rt<<1] & node[rt<<1|1]; } void update(int rt, int l, int r, int L, int R, int x) { if(L <= l && R >= r) { mark[rt] |= x; node[rt] |= x; return ; } down(rt); int mid = l+r>>1; if(L <= mid) update(lson, L, R, x); if(R > mid) update(rson, L, R, x); up(rt); } int query(int rt, int l, int r, int L, int R) { if(L <= l && R >= r) return node[rt]; down(rt); int mid = l+r>>1; int ret1 = -1, ret2 = -1; if(L <= mid) ret1 = query(lson, L, R); if(R > mid )ret2 = query(rson, L, R); up(rt); if(ret1 == -1) return ret2; if(ret2 == -1) return ret1; return ret1&ret2; } }tree; int l[N], r[N], q[N]; int main() { int n, m; scanf("%d%d", &n, &m); for(int i = 1;i <= m; i++) { scanf("%d%d%d", &l[i], &r[i], &q[i]); tree.update(1, 1, n, l[i], r[i], q[i]); } for(int i = 1;i <= m; i++) { if(tree.query(1, 1, n, l[i], r[i]) != q[i]) return puts("NO") , 0; } puts("YES"); for(int i = 1;i <= n; i++) printf("%d ", tree.query(1, 1, n, i, i)); puts(""); return 0; }
by 杰哥
http://codeforces.com/problemset/problem/482/B