Submission #675717

#TimeUsernameProblemLanguageResultExecution timeMemory
675717a_aguiloXORanges (eJOI19_xoranges)C++14
100 / 100
598 ms9720 KiB
#include<bits/stdc++.h>

using namespace std;

vector<int> segTreeOdd, segTreeEven, Odds, Evens;
int n, q;

void setUpSegTree(int node, int left, int right, vector<int>& refVector, vector<int>& SegTree){
    if(left == right) {
        SegTree[node] = refVector[left];
        return;
    }
    if(left > right) return;
    int mid = left + (right - left)/2;
    setUpSegTree(2*node, left, mid, refVector, SegTree);
    setUpSegTree(2*node+1, mid+1, right, refVector, SegTree);
    SegTree[node] = SegTree[2*node]^SegTree[2*node+1];
}

void update(int node, int left, int right, int position, int newVal, vector<int>& SegTree){
    if(right < position || left > position) return;
    if(right < left) return;
    //cout << "Node " << node << " leftBound " << left << " rightBound " << right << endl;
    if(right == left){
        SegTree[node] = newVal;
        return;
    }
    int mid = left + (right - left)/2;
    update(2*node, left, mid, position, newVal, SegTree);
    update(2*node+1, mid+1, right, position, newVal, SegTree);
    SegTree[node] = SegTree[2*node]^SegTree[2*node+1];
    //cout << "Node " << node << " leftBound " << left << " rightBound " << right << " segtree val " << SegTree[node] <<  endl;
}

int getValue(int node, int left, int right, int leftBound, int rightBound, vector<int>& SegTree){
    //cout << node << " " << left << " " << right << " " << leftBound << " " << rightBound << endl;
    if(left > rightBound || right < leftBound) return 0;
    if(left > right) return 0;
    if(leftBound <= left && rightBound >= right) return SegTree[node];
    int mid = left + (right - left)/2;
    return (getValue(2*node, left, mid, leftBound, rightBound, SegTree)^getValue(2*node+1, mid+1, right, leftBound, rightBound, SegTree));
}
int main(){
    cin >> n >> q;
    int ask, l, r, pos, newVal, concretePos;
    vector<int> indices(n);
    for(int i = 0; i < n; ++i){
        cin >> indices[i];
        if(i%2){//índice IMPAR
            Odds.push_back(indices[i]);
        }else{
            Evens.push_back(indices[i]);
        }
    }
    segTreeOdd = vector<int>(4*Odds.size());
    setUpSegTree(1, 0, Odds.size()-1, Odds, segTreeOdd);
    segTreeEven = vector<int>(4*Evens.size());
    setUpSegTree(1, 0, Evens.size()-1, Evens, segTreeEven);
    while(q--){
        cin >> ask;
        if(ask == 1){
            cin >> pos >> newVal;
            pos--;
            if(pos%2){
                update(1, 0, Odds.size()-1, pos/2, newVal, segTreeOdd);
            }else{
                update(1, 0, Evens.size()-1, pos/2, newVal, segTreeEven);
            }
        }else{
            cin >> l >> r;l--; r--;
            if((l-r+1)%2){
                if(l%2== 0){
                    cout << getValue(1, 0, Evens.size()-1, l/2, r/2, segTreeEven)<< endl;
                }
                else{
                    cout << getValue(1, 0, Odds.size()-1, l/2, r/2, segTreeOdd) << endl;
                }
            }else{
                cout << 0 << endl;
            }
        }
    }
    return 0;
}

Compilation message (stderr)

xoranges.cpp: In function 'int main()':
xoranges.cpp:45:33: warning: unused variable 'concretePos' [-Wunused-variable]
   45 |     int ask, l, r, pos, newVal, concretePos;
      |                                 ^~~~~~~~~~~
#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...