Codeforces Round #149 (Div. 2):XOR on Segment

来源:互联网 发布:淘宝网购付款收货过程 编辑:程序博客网 时间:2024/06/06 20:23

- -20棵线段树

好久没写

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<string>#include<climits>#include<set>#include<map>#include<queue>#define iinf 2000000000#define sz(x)  x.size()#define pb push_back#define mp make_pair#define lng long long#define sqr(a) ((a)*(a))#define pii pair<int,int>#define N 111111#define M 222222#define mod 1000000009#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1template<class T> inline void checkmax(T &x,T y){if(x<y) x=y;}template<class T> inline void checkmin(T &x,T y){if(x>y) x=y;}template<class T> inline T Min(T x,T y){return (x>y?y:x);}template<class T> inline T Max(T x,T y){return (x<y?y:x);}using namespace std;int n,m,op,a,b,x;int sum[N<<2][20];bool clo[N<<2][20];void pushup(int rt){    for(int i=0;i<20;++i)    {        sum[rt][i]=sum[rt<<1][i]+sum[rt<<1|1][i];    }}void pushdown(int l,int r,int rt){    int mid=(l+r)>>1;    for(int i=0;i<20;++i)    if(clo[rt][i]){     clo[rt<<1][i]^=1;     clo[rt<<1|1][i]^=1;    sum[rt<<1][i]=mid-l+1-sum[rt<<1][i];   sum[rt<<1|1][i]=r-mid-sum[rt<<1|1][i];    clo[rt][i]=0;    }}void  build(int l,int r,int rt){    if(l==r)    {        scanf("%d",&x);        for(int i=0;i<20;++i)      if(x&(1<<i)) sum[rt][i]=1;      return ;    }    int mid=(l+r)>>1;    build(lson);    build(rson);    pushup(rt);}lng query(int L,int R,int l,int r,int rt){    if(l>=L&&r<=R)    {        lng res=0;        for(lng i=0;i<20;++i)        res+=((lng)1<<i)*(lng)sum[rt][i];        return res;    }    lng res=0;    pushdown(l,r,rt);    int mid=(l+r)>>1;    if(L<=mid) res+=query(L,R,lson);    if(R>mid) res+=query(L,R,rson);   return res;}void update(int L,int R,int X,int l,int r,int rt){    if(l>=L&&r<=R)    {        for(int i=0;i<20;++i)        if(X&(1<<i))        {            clo[rt][i]^=1;            sum[rt][i]=r-l+1-sum[rt][i];        }        return ;    }    int mid=(l+r)>>1;    pushdown(l,r,rt);    if(L<=mid) update(L,R,X,lson);    if(R>mid) update(L,R,X,rson);    pushup(rt);}int main(){  while(scanf("%d",&n)==1)  {      memset(sum,0,sizeof(sum));      memset(clo,0,sizeof(clo));      build(1,n,1);      scanf("%d",&m);      for(int id=0;id<m;++id)      {          scanf("%d%d%d",&op,&a,&b);          if(op==1)          printf("%I64d\n",query(a,b,1,n,1));          else          {              scanf("%d",&x);              update(a,b,x,1,n,1);          }      }  }    return 0;}