洛谷P2574 XOR的艺术(不知道错在哪里)

#include <bits/stdc++.h>
using namespace std;

struct node
{
int sum;
int lazy;
};

int n,m;
int num[200020];
node tree[200020*4];

void build(int x,int tl,int tr)
{
if(tl==tr)
{
tree[x].sum=num[tl];
return;
}
int mid=(tl+tr)>>1;
build(2x,tl,mid);
build(2
x+1,mid+1,tr);

tree[x].sum=tree[2*x].sum+tree[2*x+1].sum;

}

void update(int x,int tl,int tr)
{
tree[x].sum=(tr-tl+1)-tree[x].sum;
if(tl!=tr)
{
tree[2x].lazy^=1;
tree[2
x+1].lazy^=1;
}
tree[x].lazy=0;
}

void change(int x,int tl,int tr,int l,int r)
{
if(tree[x].lazy&&(tl!=l||tr!=r)) update(x,tl,tr);
if(tl==l&&tr==r)
{
tree[x].lazy^=1;
num[tl]^=1;
return;
}
int mid=(tl+tr)>>1;
if(r<=mid) change(2x,tl,mid,l,r);
else if(l>mid) change(2
x+1,mid+1,tr,l,r);
else
{
change(2x,tl,mid,l,mid);
change(2
x+1,mid+1,tr,mid+1,r);
}
tree[x].sum=(mid-tl+1)tree[2x].lazy+pow(-1,tree[2x].lazy)tree[2x].sum+(tr-mid)tree[2x+1].lazy+pow(-1,tree[2x+1].lazy)tree[2x+1].sum;
}

int search(int x,int tl,int tr,int l,int r)
{
if(tree[x].lazy) update(x,tl,tr);
if(tl==l&&tr==r)
{
return tree[x].sum;
}
int mid=(tr+tl)>>1;
if(r<=mid) return search(2x,tl,mid,l,r);
else if(l>mid) return search(2
x+1,mid+1,tr,mid+1,r);
else
{
return search(2x,tl,mid,l,mid)+search(2x+1,mid+1,tr,mid+1,r);
}
}
int main()
{
char a[200020];
cin>>n>>m;
cin>>a;
for(int i=1;i<=n;i++)
{
num[i]=a[i-1]-'0';
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,x,y;
cin>>op;
if(op==0)
{
cin>>x>>y;
change(1,1,n,x,y);
}
if(op==1)
{
cin>>x>>y;
cout<<search(1,1,n,x,y)<<endl;
}
}
}

你定义的两个全局数组太大了,改用动态分配空间吧