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> using namespace std; const int maxn=1145141; int ans,n,m,a,b,c; struct tree { int l,r,sum,add; } t[maxn]; void build(int u,int x,int y) { t[u].l=x; t[u].r=y; if(x==y) { t[u].sum=0; return ; } int mid=(x+y)>>1; build(u*2,x,mid); build(u*2+1,mid+1,y); } void tag(int u) { if(t[u].add==0) return; t[u*2].sum=t[u*2].r-t[u*2].l+1-t[u*2].sum; t[u*2+1].sum=t[u*2+1].r-t[u*2+1].l+1-t[u*2+1].sum; if(t[u*2].add==0){ t[u*2].add=1; } else{ t[u*2].add=0; } if(t[u*2+1].add==0){ t[u*2+1].add=1; } else{ t[u*2+1].add=0; } t[u].add=0; } void change(int u,int l,int r) { if(l<=t[u].l&&t[u].r<=r) { t[u].sum=t[u].r-t[u].l+1-t[u].sum; if(t[u].add==0){ t[u].add=1; } else{ t[u].add=0; } return ; } tag(u); int mid=(t[u].l+t[u].r)>>1; if(a<=mid){ change(u*2,l,r); } if(b>mid){ change(u*2+1,l,r); } t[u].sum=t[u*2].sum+t[u*2+1].sum; } int ask(int u,int l,int r) { if(l<=t[u].l&&r>=t[u].r){ return t[u].sum; } tag(u); int mid=(t[u].l+t[u].r)/2; int ans=0; if(a<=mid){ ans+=ask(u*2,l,r); } if(b>mid){ ans+=ask(u*2+1,l,r); } return ans; } int main() { cin>>n>>m; build(1,1,n); for(int i=1; i<=m; i++) { cin>>c>>a>>b; if(c==0){ change(1,a,b); } else{ cout<<ask(1,a,b)<<endl; } } return 0; }
|