← Back to List

12844번: XOR ↗

Solutions

C++14
2.2 KB | 2300 chars
#include<iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll N,M,ar[550000],tree[2200000],lazy[2200000],t,a,b,c;

ll init(int start,int end,int idx)
{
    if(start==end) return tree[idx] = ar[start];
    return tree[idx] = init(start,(start+end)/2,idx*2) ^ init((start+end)/2+1,end,idx*2+1);
}

void update(int start,int end,int left,int right,int idx,ll diff)
{
    if(lazy[idx] != 0)
    {
        if((end-start+1)%2==1)
        {
            tree[idx]^=lazy[idx];
        }
        if(start!=end)
        {
            lazy[idx*2]^=lazy[idx];
            lazy[idx*2+1]^=lazy[idx];
        }
        lazy[idx]=0;
    }

    if(end < left || right < start) return ;
    if(left <= start && end <= right)
    {
        if((end-start+1)%2==1)
        {
            tree[idx] ^= diff;
        }
        if(start !=end)
        {
            lazy[idx*2]^=diff;
            lazy[idx*2+1]^=diff;
        }
        return ;
    }
    update(start,(start+end)/2,left,right,idx*2,diff);
    update((start+end)/2+1,end,left,right,idx*2+1,diff);

    tree[idx]=tree[idx*2]^tree[idx*2+1];
}

ll query(int start,int end,int left,int right,int idx)
{
    if(lazy[idx] != 0)
    {
        if((end-start+1)%2==1)
        {
            tree[idx]^=lazy[idx];
        }
        if(start!=end)
        {
            lazy[idx*2]^=lazy[idx];
            lazy[idx*2+1]^=lazy[idx];
        }
        lazy[idx]=0;
    }

    if(right < start || end < left) return 0;
    if(left <= start && end <= right) return tree[idx];
    return query(start,(start+end)/2,left,right,idx*2) ^ query((start+end)/2+1,end,left,right,idx*2+1);
}

int main()
{
    scanf("%lld",&N);
    for(int x=0; x<N; x++) scanf("%lld",&ar[x]);
    init(0,N-1,1);
    scanf("%lld",&M);
    for(int x=0; x<M; x++)
    {
        scanf("%lld",&t);
        if(t==1)
        {
            scanf("%lld %lld %lld",&a,&b,&c);
            if(a>b)
            {
                ll tmp = b;
                b=a;
                a=tmp;
            }
            update(0,N-1,a,b,1,c);
        }
        if(t==2)
        {
            scanf("%lld %lld",&a,&b);
            if(a>b)
            {
                ll tmp = b;
                b=a;
                a=tmp;
            }
            printf("%lld\n",query(0,N-1,a,b,1));
        }
    }
}