越来越菜了。
线段树秒了,但是一打分块就废了。/kk
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N=1e5+10;
int n,m;
int tag[N];
int a[N],b[N];
int id[N],len=0;
void modify(int l,int r){
int lid=id[l],rid=id[r];
if(lid==rid){
for(int i=l;i<=r;i++){
a[i]^=tag[lid],a[i]^=1;
if(!a[i]) b[lid]--; else b[lid]++;
} return ;
} for(int i=l;i<=len*lid;i++){
a[i]^=tag[lid],a[i]^=1;
if(!a[i]) b[lid]--; else b[lid]++;
} for(int i=len*(rid-1)+1;i<=r;i++){
a[i]^=tag[rid],a[i]^=1;
if(!a[i]) b[rid]--; else b[rid]++;
} for(int i=lid+1;i<rid;i++) b[i]=len-b[i],tag[i]^=1;
}
int query(int l,int r){
int lid=id[l],rid=id[r];
if(lid==rid){
int cnt=0;
for(int i=l;i<=r;i++) a[i]^=tag[lid],cnt+=a[i]; return cnt;
} int ans=0;
for(int i=l;i<=len*lid;i++) a[i]^=tag[lid],ans+=a[i];
for(int i=len*(rid-1)+1;i<=r;i++) a[i]^=tag[rid],ans+=a[i];
for(int i=lid+1;i<rid;i++) ans+=b[i]; return ans;
}
signed main(){
cin>>n>>m; len=sqrt(n);
for(int i=1;i<=n;i++) id[i]=(i-1)/len+1;
while(m--){
int opt,l,r;
cin>>opt>>l>>r;
if(!opt) modify(l,r);
else cout<<query(l,r)<<endl;
}
return 0;
}