rt , 萌新刚学0x66ccff+(0712)8(1)2天线段树求条
#include<bits/stdc++.h>
#define mid (l+r)>>2
#define lC q<<1
#define rC q<<1|1
#define int long long
#define INF 0x66ccff0712
#define endl "\n"
#define maxm 0x66ccff
#define maxn 0x6cf
#define void inline void
using namespace std;
inline int read(){
int s = 0,w = 1;char ch = getchar();
while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}
while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}
return s*w;
}
int n,m;
bool a[maxm];
struct node{
long long l,r;
long long lazy,dat;
}t[maxm];
void build(int q,int l,int r){
t[q].l=l;
t[q].r=r;
if(l==r){
t[q].dat=a[l];
return;
}
build(lC,l,mid);
build(rC,mid+1,r);
t[q].dat=t[lC].dat+t[rC].dat;
}
void lazy(int q){
if(t[q].lazy%2){
t[lC].lazy++;
t[lC].dat=t[lC].r-t[lC].l+1-t[lC].dat;
t[rC].lazy++;
t[rC].dat+=t[rC].r-t[rC].l+1-t[rC].dat;
t[q].lazy=0;
}
}
void change(int q,int l,int r){
if(t[q].l>r||t[q].r<l) return;
if(t[q].l>=l && t[q].r<=r){
t[q].lazy++;
t[q].dat=(t[q].r-t[q].l+1)-t[q].dat;
return;
}
lazy(q);
change(lC,l,r);
change(rC,l,r);
t[q].dat=t[lC].dat+t[rC].dat;
}
int ask(int q,int l,int r){
if(t[q].l>r || t[q].r<l)
return 0;
if(t[q].l>=l && t[q].r<=r)
return t[q].dat;
lazy(q);
return ask(lC,l,r)+ask(rC,l,r);
}
signed main(){
int n=read(),m=read();
string qwq;
cin>>qwq;
for(int i=1;i<=qwq.size();i++)
a[i]=qwq[i-1]-'0';
build(1,1,n);
for(int i=1;i<=m;i++){
int opt=read(),l=read(),r=read();
if(opt==0)
change(1,l,r);
else
cout<<ask(1,l,r)<<endl;
}
}