#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
//#pragma GCC optimize(2) //吸氧
//#pragma GCC optimize(3,"Ofast","inline") //吸臭氧
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
inline int read(){
char ch=getchar();
int x=0,w=1;
while(ch<'0'||ch>'9'){
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*w;
}
int n,m;
ll a[200005],sum[800005],tag[800005];
char s[200005];
ll ls(ll p){
return p*2;
}
ll rs(ll p){
return p*2+1;
}
void pushup(ll p){
sum[p]=sum[ls(p)]+sum[rs(p)];
}
void build(ll p,ll l,ll r){
if(l==r){
sum[p]=a[l];
return;
}
ll mid=(l+r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void f(ll p,ll l,ll r){
tag[p]^=1;
sum[p]=r-l+1-sum[p];
}
void pushdown(ll p,ll l,ll r){
if(tag[p]==0)
return;
ll mid=(l+r)/2;
f(ls(p),l,mid);
f(rs(p),mid+1,r);
tag[p]=0;
}
void update(ll tl,ll tr,ll p,ll l,ll r){
if(tl<=l&&r<=tr){
f(p,l,r);
return;
}
pushdown(p,l,r);
ll mid=(l+r)/2;
if(tl<=mid)
update(tl,tr,ls(p),l,mid);
if(tr>mid)
update(tl,tr,rs(p),mid+1,r);
pushup(p);
}
ll query(ll tl,ll tr,ll p,ll l,ll r){
ll res=0;
if(tl<=l&&r<=tr)
return sum[p];
pushdown(p,l,r);
ll mid=(l+r)/2;
if(tl<=mid)
res+=query(tl,tr,ls(p),l,mid);
if(tr>mid)
res+=query(tl,tr,rs(p),mid+1,r);
return res;
}
int main(int argc, const char * argv[]){
//ios::sync_with_stdio(false);
//cin.tie(0);
n=read();m=read();
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=1;i<=n;i++)
a[i]=s[i]-'0';
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y;
op=read();x=read();y=read();
if(op==0)
update(x,y,1,1,n);
if(op==1)
cout<<query(x,y,1,1,n)<<"\n";
}
return 0;
}
带着这两句就WA+TLE
ios::sync_with_stdio(false);
cin.tie(0);
不带就AC了
为啥啊