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
| #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #define int long long using namespace std; const int maxn=100005; int a[maxn]; struct tree{ int l,r; int dat; int lazy; }t[maxn<<2]; void pushup(int k) { t[k].dat=(t[k<<1].dat+t[k<<1|1].dat); } void build(int k,int l,int r) { t[k].l=l,t[k].r=r; if(l==r) { t[k].dat=a[l]; return ; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); pushup(k); } void pushdown(int k) { if(t[k].lazy) { int len=t[k].r-t[k].l+1; t[k<<1].dat=(t[k<<1].r-t[k<<1].l+1-t[k<<1].dat); t[k<<1|1].dat=(t[k<<1|1].r-t[k<<1|1].l+1-t[k<<1|1].dat); t[k<<1].lazy^=1; t[k<<1|1].lazy^=1; t[k].lazy^=1; } } void update(int k,int l,int r) { if(l<=t[k].l&&t[k].r<=r) { t[k].dat=(t[k].r-t[k].l+1-t[k].dat); t[k].lazy^=1; return ; } pushdown(k); int mid=(t[k].l+t[k].r)>>1; if(l<=mid) update(k<<1,l,r); if(r>mid) update(k<<1|1,l,r); pushup(k); } int query(int k,int l,int r) { if(l<=t[k].l&&t[k].r<=r) return t[k].dat; pushdown(k); int res=0; int mid=(t[k].l+t[k].r)>>1; if(l<=mid) res+=query(k<<1,l,r); if(r>mid) res+=query(k<<1|1,l,r); return res; } int n,m; signed main() { cin>>n>>m; memset(a,0,sizeof(a)); build(1,1,n); while(m--) { int op,l,r; cin>>op>>l>>r; if(op==0) update(1,l,r); else if(op==1) cout<<query(1,l,r)<<'\n'; } return 0; }
|