제출 #1366369

#제출 시각아이디문제언어결과실행 시간메모리
1366369opeleklanosXORanges (eJOI19_xoranges)C++20
30 / 100
143 ms131072 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*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));
}

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);

}

segTree* query(int l, int r, segTree*st){
    segTree * ret = new segTree(l);
    ret->l = st->l;
    ret->r = st->r;
    ret->xor0 = st->xor0;
    ret->xor1 = st->xor1;
    if(st->l == st->r){
        return ret;
    }
    
    int mid = (st->l + st->r)/2;
    
    segTree * le=nullptr; segTree*ri=nullptr;
    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) return ri;
    if(!ri) return le;
    
    ret->l = le->l;
    ret->r = ri->r;
    ret->xor0 = le->xor0 ^ ((le->even)?ri->xor0:ri->xor1);
    ret->xor1 = le->xor1 ^ ((le->even)?ri->xor1:ri->xor0);
    
    ret->even = (ret->r - ret->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--;
            segTree * qu = query(l, r, seg);
            if(qu->even) cout<< 0;
            else cout<<qu->xor0;

            cout<<endl;
        }
    }

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…