那位巨佬帮我这个蒟蒻看看。第49行和51行,lm和rm%=2为什么会输出48和49? 不应该只是为1或0吗?
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+15;
int n,q,op,cl,cr,flag,d[N];
char arr[N];
struct Node{
int l,r,sum,la;
}tr[N<<2];
void build(int id,int l,int r){
tr[id]={l,r,0,0};
if(l==r){
d[l]=id;
tr[id].sum=1;
cout<<"id:"<<id<<" l:"<<l<<" r:"<<r<<" sum:"<<tr[id].sum<<endl;
return ;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
if(tr[id<<1].sum==1&&tr[id<<1|1].sum==1&&arr[mid]!=arr[mid+1])
tr[id].sum=1;
cout<<"id:"<<id<<" l:"<<l<<" r:"<<r<<" sum:"<<tr[id].sum<<endl;
}
void pushdown(int id){
int la=tr[id].la;
if(la){
//int l=tr[id].l,r=tr[id].r,mid=l+r>>1;
tr[id<<1].la^=1;
tr[id<<1|1].la^=1;
tr[id].la=0;
//不确定要不要加东西
}
}
void modify(int id,int x,int y){
int l=tr[id].l,r=tr[id].r;
if(x<=l&&r<=y){
tr[id].la^=1;
if(l==r) arr[l]^=1;
cout<<"id:"<<id<<" sum:"<<tr[id].sum<<" la:"<<tr[id].la<<endl;
//不确定要不要加东西
return ;
}
pushdown(id);
int mid=l+r>>1;
if(x<=mid) modify(id<<1,x,y);
if(y>mid) modify(id<<1|1,x,y);
int lm=arr[mid],rm=arr[mid];
if(tr[id].la){
lm%=2,rm%=2;
}
cout<<"lm:"<<lm<<" rm:"<<rm<<endl;
if(tr[id<<1].sum==1&&tr[id<<1|1].sum==1&&((tr[id<<1].la==tr[id<<1|1].la&&lm!=rm)||(tr[id<<1].la!=tr[id<<1|1].la&&lm==rm))){
tr[id].sum=1;
}
else{
tr[id].sum=0;
}
cout<<"id:"<<id<<" sum:"<<tr[id].sum<<" la:"<<tr[id].la<<endl;
}
int query(int id,int x,int y){
int l = tr[id].l , r = tr[id].r;
if(x<=l&&r<=y){
cout<<"id:"<<id<<" sum:"<<tr[id].sum<<endl;
return tr[id].sum;
}
int mid=l+r>>1,ret=1;
if(x<=mid) ret=min(ret,query(id<<1,x,y));
if(y>mid) ret=min(ret,query(id<<1|1,x,y));
return ret;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i = 1 ; i<=n ; i++){
cin>>arr[i];
}
build(1,1,n);
for(int i = 1 ; i<=q ; i++){
cin>>op>>cl>>cr;
if(op==1){
cout<<"id:"<<"4"<<" sum:"<<tr[4].sum<<" la:"<<tr[4].la<<endl;
modify(1,cl,cr);
}
else if(op==2){
flag=query(1,cl,cr);
if(flag==0) cout<<"No"<<endl;
else if(flag==1) cout<<"Yes"<<endl;
}
}
return 0;
}