标签:codeforces c++ acm 数据结构
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 100010
#define L(x) (x)<<1
#define R(x) (x)<<1|1
using namespace std;
struct node
{
int l,r,cnt,lazy;
node(long long ll,long long rr,long long c,long long la)
{
l=ll,r=rr,cnt=c,lazy=la;
}
node()
{
l=r=cnt=lazy=0;
}
}p[20][N*4];
long long a[N][20],num[N],two[22];
long long bulid(long long id,long long l,long long r,long long na)
{
if(l==r){p[na][id]=node(l,r,a[l][na],0);return a[l][na];}
long long mid=(l+r)/2;
long long cur=bulid(L(id),l,mid,na)+bulid(R(id),mid+1,r,na);
p[na][id]=node(l,r,cur,0);
return cur;
}
void revers(long long id,long long l,long long r,long long na)
{
if(p[na][id].l==l && p[na][id].r==r)
{
p[na][id].lazy=1-p[na][id].lazy;
p[na][id].cnt=p[na][id].r-p[na][id].l+1-p[na][id].cnt;
return ;
}
if(p[na][id].lazy)//lazy tag 下放
{
p[na][id].lazy=0;
p[na][L(id)].lazy=1-p[na][L(id)].lazy;
p[na][R(id)].lazy=1-p[na][R(id)].lazy;
p[na][L(id)].cnt=p[na][L(id)].r-p[na][L(id)].l+1-p[na][L(id)].cnt;
p[na][R(id)].cnt=p[na][R(id)].r-p[na][R(id)].l+1-p[na][R(id)].cnt;
}
long long mid=(p[na][id].l+p[na][id].r)/2;
if(mid<l) revers(R(id),l,r,na);
else if(mid>=r) revers(L(id),l,r,na);
else revers(L(id),l,mid,na),revers(R(id),mid+1,r,na);
p[na][id].cnt=p[na][L(id)].cnt+p[na][R(id)].cnt;
}
long long query(long long id,long long l,long long r,long long na)
{
if(p[na][id].l==l && p[na][id].r==r) return p[na][id].cnt;
if(p[na][id].lazy)
{
p[na][id].lazy=0;
p[na][L(id)].lazy=1-p[na][L(id)].lazy;
p[na][R(id)].lazy=1-p[na][R(id)].lazy;
p[na][L(id)].cnt=p[na][L(id)].r-p[na][L(id)].l+1-p[na][L(id)].cnt;
p[na][R(id)].cnt=p[na][R(id)].r-p[na][R(id)].l+1-p[na][R(id)].cnt;
}
long long mid=(p[na][id].l+p[na][id].r)/2;
if(mid>=r) return query(L(id),l,r,na);
else if(mid<l) return query(R(id),l,r,na);
else return query(L(id),l,mid,na)+query(R(id),mid+1,r,na);
}
int main()
{
two[0]=1;
for(long long i=1;i<21;i++) two[i]=two[i-1]*2;
long long n;
scanf("%I64d",&n);
for(long long i=1;i<=n;i++)
{
scanf("%I64d",&num[i]);
long long j=0;
while(num[i]>0)
{
a[i][j++]=num[i]&1;
num[i]>>=1;
}
}
for(long long i=0;i<20;i++)
bulid(1,1,n,i);
long long m;
scanf("%I64d",&m);
while(m--)
{
long long ty;
scanf("%I64d",&ty);
if(ty==1)
{
long long a,b;
scanf("%I64d%I64d",&a,&b);
long long cur=0;
for(long long i=0;i<20;i++)
cur+=query(1,a,b,i)*two[i];
cout<<cur<<endl;
}
else
{
long long a,b,x;
scanf("%I64d%I64d%I64d",&a,&b,&x);
for(long long i=0;i<20 && x;i++,x>>=1)
{
if(x&1) revers(1,a,b,i);
}
}
}
return 0;
}Codeforces 242E. XOR on Segment
标签:codeforces c++ acm 数据结构
原文地址:http://blog.csdn.net/u013912596/article/details/39006317