Submission #637397

#TimeUsernameProblemLanguageResultExecution timeMemory
637397kidesoXORanges (eJOI19_xoranges)C++17
100 / 100
565 ms5588 KiB
#include <iostream>
#include <queue>

using namespace std;

vector<vector<int> > x;
int N, Q;

struct Segment_tree{
    vector<int> st;

    void init_segment_tree(int N){
        st.assign(4 * N + 1, 0);
    }

    void build_segment_tree(int p, int l, int r, int k){
        if(l == r){
            st[p] = x[k][l];
            return;
        }

        int m = (l + r) / 2;
        build_segment_tree(2 * p, l, m, k);
        build_segment_tree(2 * p + 1, m + 1, r, k);

        st[p] = st[2 * p] ^ st[2 * p + 1];
    }

    void update_segment_tree(int p, int l, int r, int k, int i){
        if(l == r){
            st[p] = x[k][l];
            return;
        }

        int m = (l + r) / 2;
        if(i <= m)
            update_segment_tree(2 * p, l, m, k, i);
        else
            update_segment_tree(2 * p + 1, m + 1, r, k, i);

        st[p] = st[2 * p] ^ st[2 * p + 1];
    }

    int range_query(int p, int l, int r, int ql, int qr){
        if(ql <= l && r <= qr)
            return st[p];
        
        if(r < ql || qr < l) return 0;

        int m = (r + l) / 2;
        
        return range_query(2 * p, l, m, ql, qr) ^ range_query(2 * p + 1, m + 1, r, ql, qr);
    }
};

int main(){
    cin >> N >> Q;

    x.assign(2, vector<int> ());

    x[0].push_back(0);
    x[1].push_back(0);
    int p;

    for(int i = 1; i <= N; ++i){
        cin >> p;
        x[i % 2].push_back(p);
    }

    Segment_tree stree[2];

    for(int i = 0; i < 2; ++i){
        stree[i].init_segment_tree(x[i].size());
        stree[i].build_segment_tree(1, 1, x[i].size() - 1, i);
    }

    int t, a, b;

    while(Q--){
        cin >> t >> a >> b;
        if(t == 1){
            x[a % 2][a / 2 + a % 2] = b;
            stree[a % 2].update_segment_tree(1, 1, x[a % 2].size() - 1, a % 2, a / 2 + a % 2);
        }
        else{
            if((b - a + 1) % 2 == 0){
                cout << 0 << '\n';
                continue;
            }
            else
                cout << stree[a % 2].range_query(1, 1, x[a % 2].size() - 1, a / 2 + a % 2, b / 2 + b % 2) << '\n';
        }
    }

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