RT Code:
#include<iostream>
using namespace std;
int n,m,op,x,y,t[400020],tag[400020];
void upd(int u){t[u]=t[u*2]+t[u*2+1];}
bool inrange(int l1,int r1,int l2,int r2) {return (l1>=l2)&&(r1<=r2);}
bool outofrange(int l1,int r1,int l2,int r2) {return (l1>r2)||(l2>r1);}
void maketag(int u,int l,int r,int x){tag[u]^=x;t[u]=r-l+1-t[u];}
void pushdown(int u,int l,int r){maketag(u*2,l,(l+r)/2,tag[u]);maketag(u*2+1,(l+r)/2+1,r,tag[u]);tag[u]=0;}
void add(int u,int ll,int rr,int l,int r)
{
if(inrange(ll,rr,l,r)) maketag(u,ll,rr,1);
else if(!outofrange(ll,rr,l,r))
{
pushdown(u,ll,rr);
add(u*2,ll,(ll+rr)/2,l,r)
add(u*2+1,(ll+rr)/2+1,rr,l,r);
upd(u);
}
}
int search(int u,int ll,int rr,int l,int r)
{
if(inrange(ll,rr,l,r)) return t[u];
if(outofrange(ll,rr,l,r)) return 0;
pushdown(u,ll,rr);
return search(u*2,ll,(ll+rr)/2,l,r)+search(u*2+1,(ll+rr)/2+1,rr,l,r);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>op>>x>>y;
if(op==0) add(1,1,n,x,y);
if(op==1) cout<<search(1,1,n,x,y);
}
return 0;
}