1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include<bits/stdc++.h> #define ll long long #define ull unsigned long long #define maxn 200005 #define put() putchar('\n') using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } int cnt,root; struct yyy{ int lazy,ls,rs,size; }a[maxn*20]; inline void Pushup(int k) {a[k].size=a[a[k].ls].size+a[a[k].rs].size;} inline void Pushdown(int l,int r,int k) { if (a[k].lazy==1) { int mid=l+r>>1; if (!a[k].ls) a[k].ls=++cnt;if (!a[k].rs) a[k].rs=++cnt; a[a[k].ls].lazy=a[a[k].rs].lazy=1; a[a[k].ls].size=mid-l+1,a[a[k].rs].size=r-mid; a[k].lazy=0; } if (a[k].lazy==-1) { int mid=l+r>>1; if (!a[k].ls) a[k].ls=++cnt;if (!a[k].rs) a[k].rs=++cnt; a[a[k].ls].lazy=a[a[k].rs].lazy=-1; a[a[k].ls].size=0,a[a[k].rs].size=0; a[k].lazy=0; } } inline void insert(int l,int r,int &k,int head,int tail) { if (!k) k=++cnt; if (head<=l&&r<=tail) return a[k].size=r-l+1,a[k].lazy=1,void(); Pushdown(l,r,k); int mid=l+r>>1; if (head<=mid) insert(l,mid,a[k].ls,head,tail); if (tail>mid) insert(mid+1,r,a[k].rs,head,tail); Pushup(k); } inline void del(int l,int r,int &k,int head,int tail) { if (!k) k=++cnt; if (head<=l&&r<=tail) return a[k].size=0,a[k].lazy=-1,void(); Pushdown(l,r,k); int mid=l+r>>1; if (head<=mid) del(l,mid,a[k].ls,head,tail); if (tail>mid) del(mid+1,r,a[k].rs,head,tail); Pushup(k); } inline int rk(int l,int r,int &k,int head) { if (!k) return 0; if (l==r) return a[k].size; int mid=l+r>>1;Pushdown(l,r,k); if (head<=mid) return rk(l,mid,a[k].ls,head); else return a[a[k].ls].size+rk(mid+1,r,a[k].rs,head); } inline int query(int l,int r,int deep,int &k,int x) { if (!k) return 0; if (l==r) return 0; int mid=l+r>>1;Pushdown(l,r,k);
if ((x>>deep)&1) { if (a[a[k].ls].size) return query(l,mid,deep-1,a[k].ls,x)+(1<<deep); else return query(mid+1,r,deep-1,a[k].rs,x); } else { if (a[a[k].rs].size) return query(mid+1,r,deep-1,a[k].rs,x)+(1<<deep); else return query(l,mid,deep-1,a[k].ls,x); } } const int maxdeep=29,MASK=(1<<30)-1; signed main(void){ int T,op,x,l,r; read(T); while (T--) { read(op); if (op==1) read(l),read(r),insert(0,MASK,root,l,r); else if (op==2) read(l),read(r),del(0,MASK,root,l,r); else if (op==3) read(x),printf("%d\n",rk(0,MASK,root,x)-rk(0,MASK,root,x-1)); else if (op==4) read(x),printf("%d\n",(x==0?1:rk(0,MASK,root,x-1)+1)); else read(x),printf("%d\n",query(0,MASK,maxdeep,root,x)); } return 0; }
|