P3870 [TJOI2009] 代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define dd double
#define endl "\n"
#define pp p<<1
#define ppp p<<1|1
const int N=2e5+10,inf=0x7fffffff;
ll n,q,now[N<<2],sign[N<<2];
ll pushup(ll s,ll t,ll p){
ll m=(s+t)>>1;
sign[pp]+=sign[p];
sign[ppp]+=sign[p];
sign[pp]=sign[pp]&1;
sign[ppp]=sign[ppp]&1;
if(sign[p]&1)
now[pp]=m-s+1-now[pp];
if(sign[p]&1)
now[ppp]=t-m-now[ppp];
sign[p]=0;
}
ll getm(ll s,ll t,ll l,ll r,ll p){
if(l<=s&&t<=r)
return now[p];
pushup(s,t,p);
ll m=(s+t)>>1,res=0;
if(l<=m)res=getm(s,m,l,r,pp);
if(r>m)res+=getm(m+1,t,l,r,ppp);
return res;
}
void update(ll s,ll t,ll l,ll r,ll p){
if(l<=s&&t<=r){
now[p]=t-s+1-now[p];
sign[p]++;
sign[p]=sign[p]&1;
return ;
}
pushup(s,t,p);
ll m=(s+t)>>1;
if(l<=m)update(s,m,l,r,pp);
if(r>m)update(m+1,t,l,r,ppp);
now[p]=now[pp]+now[ppp];
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>q;
while(q--){
ll c,a,b;
cin>>c>>a>>b;
if(c)
cout<<getm(1,n,a,b,1)<<endl;
else
update(1,n,a,b,1);
}
}