样例
10 6
1011101001
0 2 4
1 1 5
0 3 7
1 1 10
0 1 4
1 2 6
输出
3
6
1
我输出
3
3
1
#include<iostream>
#define ls(p) p<<1
#define rs(p) p<<1|1
using namespace std;
int n,a[200005],m;
char s[200005];
struct segtree{
int num,tag,l,r;
#define l(p) t[p].l
#define r(p) t[p].r
#define num(p) t[p].num
#define tag(p) t[p].tag
#define op(p) num(p)=num(ls(p))+num(rs(p))
#define f(p) p=!p
#define lson ls(p),l,r
#define rson rs(p),l,r
}t[8000050];
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r){
num(p)=a[l];
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
op(p);
}
void down(int p){
if(tag(p)){
f(tag(ls(p)));
f(tag(rs(p)));
num(ls(p))=r(ls(p))-l(ls(p))+1-num(ls(p));
num(rs(p))=r(rs(p))-l(rs(p))+1-num(rs(p));
tag(p)=0;
}
}
void change(int p,int l,int r){
if(l<=l(p)&&r(p)<=r){
num(p)=r(p)-l(p)+1-num(p);
f(tag(p));
return;
}
down(p);
int mid=l(p)+r(p)>>1;
if(l<mid)change(lson);
else change(rson);
op(p);
}
int ask(int p,int l,int r){
if(l<=l(p)&&r(p)<=r)return num(p);
down(p);
int ans=0,mid=l(p)+r(p)>>1;
if(l<mid)ans+=ask(lson);
else ans+=ask(rson);
return ans;
}
main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
a[i]=s[i]-'0';
}
build(1,1,n);
for(int i=1;i<=m;i++){
int o,l,r;
cin>>o>>l>>r;
if(!o)change(1,l,r);
else cout<<ask(1,l,r)<<"\n";
}
}