如題
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300020;
int read(){
int sz=0,zf=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') zf=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
sz=sz*10+(ch-'0');
ch=getchar();
}
return sz*zf;
}
int a[N],add[N<<2],sum[N<<2];
void getup(int pp){
sum[pp]=sum[pp<<1]+sum[pp<<1|1];
}
void build(int l,int r,int pp){
if(l==r){
sum[pp]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,pp<<1),build(mid+1,r,pp<<1|1);
getup(pp);
}
void pushdown(int pp,int len){
if(add[pp]) add[pp<<1]^=1,add[pp<<1|1]^=1,sum[pp<<1]=(len-(len>>1))-sum[pp<<1],sum[pp<<1|1]=(len>>1)-sum[pp<<1|1],add[pp]=0;
}
int query(int L,int R,int l,int r,int pp){
if(l>=L&&r<=R) return sum[pp];
pushdown(pp,r-l+1);
int mid=(r+l)>>1,tot=0;
if(L<=mid) tot+=query(L,R,l,mid,pp<<1);
if(mid+1<=R) tot+=query(L,R,mid+1,r,pp<<1|1);
return tot;
}
void update(int L,int R,int l,int r,int pp){
pushdown(pp,r-l+1);
if(l>=L&&r<=R){
add[pp]^=1,sum[pp]=r-l+1-sum[pp];
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,pp<<1);
if(mid+1<=R) update(L,R,mid+1,r,pp<<1|1);
getup(pp);
}
signed main(){
int n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=getchar()-'0';
build(1,n,1);
while(m--){
int p=read(),l=read(),r=read();
switch(p){
case 0:
update(l,r,1,n,1);
break;
case 1:
printf("%lld",query(l,r,1,n,1));
puts("");
break;
}
}
return 0;
}