제출 #246138

#제출 시각아이디문제언어결과실행 시간메모리
246138promaXORanges (eJOI19_xoranges)C++17
100 / 100
185 ms16236 KiB
#include <bits/stdc++.h>
#define endl "\n"
#define int long long
#define see(x) cerr<<#x<<"="<<x<<endl;

using namespace std;

const int N = 2*1e5 + 10;

int n, q, a[N], t1[4*N], t2[4*N];

void build (int x, int l, int r) {
    if (l == r) {
        if (l % 2) t1[x] = a[l];
        else t2[x] = a[l];
        return;
    }
    int m = (l + r) / 2;
    build(2*x+1, l, m);
    build(2*x+2, m+1, r);
    t1[x] = t1[2*x+1] ^ t1[2*x+2];
    t2[x] = t2[2*x+1] ^ t2[2*x+2];
}

void update (int x, int l, int r, int i, int v) {
    if (l == r) {
        if (i % 2) t1[x] = v;
        else t2[x] = v;
        return;
    }
    int m = (l + r) / 2;
    if (i > m) update(2*x+2, m+1, r, i, v);
    else update(2*x+1, l, m, i, v);
    t1[x] = t1[2*x+1] ^ t1[2*x+2];
    t2[x] = t2[2*x+1] ^ t2[2*x+2];
}

int get (int x, int lx, int rx, int l, int r, int type) {
    if (lx > r or rx < l) return 0;
    if (lx >= l and rx <= r) {
        if (type == 1) return t1[x];
        else return t2[x];
    }
    int m = (lx + rx) / 2;
    int g1 = get(2*x+1, lx, m, l, r, type);
    int g2 = get(2*x+2, m+1, rx, l, r, type);
    return g1 ^ g2;
} 

int32_t main () {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n >> q;

    for (int i = 0; i < n; ++ i)
        cin >> a[i];

    build(0, 0, n-1);

    while (q --) {
        int t, i, j;
        cin >> t >> i >> j;
        if (t == 1) update(0, 0, n-1, i-1, j);
        else if ((j - i) % 2) cout << "0\n";
        else if (i % 2) cout << get(0, 0, n-1, i-1, j-1, 2) << endl;
        else cout << get(0, 0, n-1, i-1, j-1, 1) << endl;
    }

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