前边的求助帖没看懂,代码求调
#include<iostream>
#define lint long long
using namespace std;
struct xds{
int l,r,k,g,f;
}xd[800050];
lint a[200050];
int n,m;
int op,x,y;
lint k;
void init(int id,int l,int r)
{
xd[id].f=0,xd[id].l=l,xd[id].r=r;
int mid=(l+r)/2;
xd[id].k=0,xd[id].g=r-l+1;
if(l-r)
{
init(id*2,l,mid);
init(id*2+1,mid+1,r);
}
}
lint cha(int id,int l,int r)
{
if(xd[id].l<xd[id].r) xd[id*2].f^=xd[id].f,xd[id*2+1].f^=xd[id].f;
if(xd[id].f) swap(xd[id].k,xd[id].g);
xd[id].f=0;
if(xd[id].l==l&&xd[id].r==r) return xd[id].k;
else if(xd[id].l<=l&&xd[id].r>=r&&l<=r)
{
int mid=(xd[id].l+xd[id].r)/2;
return cha(id*2,l,min(r,mid))+cha(id*2+1,max(l,mid+1),r);
}
return 0;
}
void gai(int id,int l,int r)
{
if(xd[id].l==l&&xd[id].r==r)
{
xd[id*2].f^=1;
xd[id*2+1].f^=1;
swap(xd[id].k,xd[id].g);
}
else if(xd[id].l<=l&&xd[id].r>=r&&l<=r)
{
int mid=(xd[id].l+xd[id].r)/2;
gai(id*2,l,min(r,mid));
gai(id*2+1,max(l,mid+1),r);
xd[id].k=xd[id*2].k+xd[id*2+1].k;
xd[id].g=xd[id*2].g+xd[id*2+1].g;
}
}
int main()
{
cin>>n>>m;
init(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>op>>x>>y;
if(op) cout<<cha(1,x,y)<<'\n';
else
{
gai(1,x,y);
}
}
return 0;
}