求调:
线段树,区间异或,求区间加。 出现了点未知错。
#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)/2)
#define ls(x) (2*x)
#define rs(x) (2*x+1)
const int N=1e5+10;
using namespace std;
int n,m,tr[4*N],lzy[4*N];
void pushup(int u){
tr[u]=tr[ls(u)]+tr[rs(u)];
}
void maketag(int u,int l,int r){
int len=r-l+1;
tr[u]=(len-tr[u]);
lzy[u]^=1;
}
void pushdown(int u,int l,int r){
if(!lzy[u]) return;
maketag(ls(u),l,mid);
maketag(rs(u),mid+1,r);
lzy[u]=0;
}
void update(int u,int l,int r,int L,int R){
if(l>=L&&r<=R){
maketag(u,l,r);
return;
}else if(r<L||l>R){
pushdown(u,l,r);
update(ls(u),l,mid,L,R);
update(rs(u),mid+1,r,L,R);
pushup(u);
}
}
int ask(int u,int l,int r,int L,int R){
if(l>=L&&r<=R){
return tr[u];
}else if(r<L||l>R){
pushdown(u,l,r);
return ask(ls(u),l,mid,L,R)+ask(rs(u),mid+1,r,L,R);
}
}
signed main(){
cin>>n>>m;
while(m--){
int op,l,r;
cin>>op>>l>>r;
if(!op){
update(1,1,n,l,r);
}else{
cout<<ask(1,1,n,l,r)<<"\n";
}
}
return 0;
}