Submission #1366380

#TimeUsernameProblemLanguageResultExecution timeMemory
1366380opeleklanosXORanges (eJOI19_xoranges)C++20
55 / 100
1094 ms19992 KiB
#include <iostream>
#include <vector>
using namespace std;

vector<int> arr;

struct segTree{
    segTree * lc, * rc;
    int l, r;
    int xor0, xor1;
    int even;
    
    segTree(int indx){
        even = 0;
        l = r = indx;
        xor0 = arr[indx];
        xor1 = 0;
        lc = rc = nullptr;
    }
    
    segTree(segTree*le, segTree*ri){
        lc = le;
        rc = ri;
        l = le->l;
        r = ri->r;
        xor0 = le->xor0;
        if(lc->even) xor0 ^= rc->xor0;
        else xor0 ^= rc->xor1;
        
        xor1 = le->xor1;
        if(lc->even) xor1 ^= rc->xor1;
        else xor1 ^= rc->xor0;

        even = !((r-l+1)%2);
    }

    ~segTree(){
        if(lc) delete lc;
        if(rc) delete rc;
    }
};

segTree*build(int l, int r){
    if(l == r) return new segTree(l);
    int mid = (l+r)/2;
    return new segTree(build(l, mid), build(mid+1, r));
}

struct plain_ans{
    int xor0;
    int xor1;
    int even;
};

void update(int indx, int newVal, segTree*st){
    if(st->l == st->r){
        st->xor0 = newVal;
        return;
    }
    
    int mid = (st->l + st->r)/2;
    
    if(indx<=mid) update(indx, newVal, st->lc);
    else update(indx, newVal, st->rc);
    
    if(st->lc->even){
        st->xor0 = st->lc->xor0 ^ st->rc->xor0;
        st->xor1 = st->lc->xor1 ^ st->rc->xor1;
    }
    
    else{
        st->xor0 = st->lc->xor0 ^ st->rc->xor1;
        st->xor1 = st->lc->xor1 ^ st->rc->xor0;
    }

    st->even = !((st->r-st->l+1)%2);

}

plain_ans query(int l, int r, segTree*st){
    plain_ans ret;

    if(st->l == st->r){
        ret.even = !((r-l+1) %2);
        ret.xor1 = 0;
        ret.xor0 = st->xor0;
        return ret;
    }
    
    int mid = (st->l + st->r)/2;
    
    plain_ans le, ri;
    le.even = ri.even = -1;
    if(l<=mid) le = query(l, min(mid, r), st->lc);
    if(r>mid) ri = query(max(mid+1, l), r, st->rc);
    
    if(le.even==-1) return ri;
    if(ri.even == -1) return le;
    

    ret.xor0 = le.xor0 ^ ((le.even)?ri.xor0:ri.xor1);
    ret.xor1 = le.xor1 ^ ((le.even)?ri.xor1:ri.xor0);
    
    ret.even = (r - l + 1) %2;
    ret.even = !ret.even;
    
    return ret;
}


int main(void){
    // freopen("input.txt", "r", stdin);
    int n, q;
    cin>>n>>q;
    arr.assign(n, 0);
    for(int i = 0; i<n; i++) cin>>arr[i];

    segTree * seg = build(0, n-1);

    for(int i = 0; i<q; i++){
        int act; cin>>act;
        if(act == 1){
            int indx, newVal;
            cin>>indx>>newVal;
            indx--;
            update(indx, newVal, seg);
        }
        else{
            int l, r; cin>>l>>r;
            l--, r--;
            plain_ans qu = query(l, r, seg);
            if(qu.even) cout<< 0;
            else cout<<qu.xor0;

            cout<<endl;
        }
    }

    delete seg;

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...