제출 #1333376

#제출 시각아이디문제언어결과실행 시간메모리
1333376greedyajXORanges (eJOI19_xoranges)C++20
100 / 100
353 ms4428 KiB
#include<iostream>
#include<vector>
using namespace std;

struct segtree {
    int n;
    vector<int> arr;

    segtree(int sizex) {
        n = 1;
        while (n < sizex) n<<=1;
        arr.resize(2*n);
    }

    void build(vector<int> &init, int x, int lx, int rx) {
        if (rx - lx == 1) {
            if (lx < init.size()) arr[x] = init[lx];
            return;
        }
        int m = (lx+rx)>>1;
        build(init,2*x+1,lx,m);
        build(init,2*x+2,m,rx);
        arr[x] = arr[2*x+1] ^ arr[2*x+2];
    }

    void build(vector<int> &init){ build(init,0,0,n); }

    void update(int i, int v, int x, int lx, int rx) {
        if (rx - lx == 1 and lx == i){ arr[x] = v; return; }
        if (lx <= i and i < rx) {
            int m = (lx+rx)>>1;
            if (i < m) update(i,v,2*x+1,lx,m);
            else update(i,v,2*x+2,m,rx);
            arr[x] = arr[2*x+1] ^ arr[2*x+2];
        }
    }

    int query(int i, int j, int x, int lx, int rx) {
        if (i <= lx and rx <= j) return arr[x];
        if (i >= rx or j <= lx) return 0;
        int m = (lx+rx)>>1;
        return query(i,j,2*x+1,lx,m) ^ query(i,j,2*x+2,m,rx);
    }

    void update(int i, int v){update(i,v,0,0,n);};
    int query(int i, int j){return query(i,j,0,0, n);}

    void debug() {
        for (int i = 0; i < 2*n - 1; i++) cerr<<arr[i]<<" ";
        cerr<<endl;
    }
};

int main() {
    int n,q; cin>>n>>q;
    vector<int> odd;
    vector<int> even;

    for (int i = 0; i < n; i++) {
        int x; cin>>x;
        if (i & 1) even.push_back(x);
        else odd.push_back(x);
    }

    segtree seg_odd(odd.size()),seg_even(even.size());

    seg_odd.build(odd); seg_even.build(even);

    while (q--) {
        int t; cin>>t;
        if (t == 1) {
            int i,j; cin>>i>>j; i--;
            if (i&1) seg_even.update(i/2,j);
            else seg_odd.update(i/2,j);
        }
        else {
            int u,v; cin>>u>>v; u--; v--;
            if ((v - u + 1)%2 == 0) {
                cout<<0<<endl;
                continue;
            }
            if (u&1) cout<<seg_even.query(u/2,(v/2)+1)<<endl;
            else cout<<seg_odd.query(u/2,(v/2)+1)<<endl;
        }
    }
}

#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...