제출 #1173592

#제출 시각아이디문제언어결과실행 시간메모리
1173592andriy57XORanges (eJOI19_xoranges)C++20
100 / 100
318 ms12976 KiB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define forin for(int i = 1; i <= n; i++)
#define stforin for(int i = 0; i < n; i++)
#define forim for(int i = 1; i <= m; i++)
#define forjn for(int j = 1; j <= n; j++)
#define forch(j, n) for(int i = j; i <= n; i++)
#define forch2(i, j, n) for(int i = j; i <= n; i++)
#define forjm for(int j = 1; j <= m; j++)
#define lol long long
#define lb long double
#define all(a) (x).begin(), (x).end();
#define endl '\n'
#define debug cout << "Completed" << endl;
#define fix(n, m) cout << fixed; cout.precision(m); cout << n << endl
#define pll pair<lol, lol>
#define mod 1000000007
#define fst first
#define snd second
#define inf 1e15
#define tofix cin
; string sbuf;
ostringstream buf(sbuf);
istringstream atcin(sbuf);
//priority_queue <pll, vector<pll>, greater<pll>> q
const long long N = 2e5 + 10;
lol i, t, n, j, v, a[N], b[N], k, l, r, all, tr[4*N], c, tr2[4*N];
void tree(int g, int ll, int rr) {
    if (ll == rr) {
        tr[g] = a[ll];
        return;
    }
    int m = (ll + rr) / 2;
    tree(2 * g + 1, ll, m);
    tree(2 * g + 2, m + 1, rr);
    tr[g] = tr[2 * g + 1] ^ tr[2 * g + 2];
}
long long que(int g, int ll, int rr, int l, int r) {
    if (r < ll || rr < l) return 0;
    if (l <= ll && rr <= r) return tr[g];
    int m = (ll + rr) / 2;
    return que(2 * g + 1, ll, m, l, r) ^ que(2 * g + 2, m + 1, rr, l, r);
}
void update(int g, int ll, int rr, int p, long long v) {
    if (p < ll || rr < p) return;
    if (ll == rr) { tr[g] = v; return; }
    int m = (ll + rr) / 2;
    update(2 * g + 1, ll, m, p, v);
    update(2 * g + 2, m + 1, rr, p, v);
    tr[g] = tr[2 * g + 1] ^ tr[2 * g + 2];
}
void tree2(int g, int ll, int rr) {
    if (ll == rr) {
        tr2[g] = b[ll];
        return;
    }
    int m = (ll + rr) / 2;
    tree2(2 * g + 1, ll, m);
    tree2(2 * g + 2, m + 1, rr);
    tr2[g] = tr2[2 * g + 1] ^ tr2[2 * g + 2];
}
long long que2(int g, int ll, int rr, int l, int r) {
    if (r < ll || rr < l) return 0;
    if (l <= ll && rr <= r) return tr2[g];
    int m = (ll + rr) / 2;
    return que2(2 * g + 1, ll, m, l, r) ^ que2(2 * g + 2, m + 1, rr, l, r);
}
void update2(int g, int ll, int rr, int p, long long v) {
    if (p < ll || rr < p) return;
    if (ll == rr) { tr2[g] = v; return; }
    int m = (ll + rr) / 2;
    update2(2 * g + 1, ll, m, p, v);
    update2(2 * g + 2, m + 1, rr, p, v);
    tr2[g] = tr2[2 * g + 1] ^ tr2[2 * g + 2];
}
int main() {
    cin >> n >> k;
    forin {
        cin >> v;
    if (i % 2 == 0) a[i] = v;
    else b[i] = v;
    }
    tree(0, 1, n);
    tree2(0, 1, n);
    forch(1, k) {
        cin >> c >> l >> r;
        if (c == 2) {
            if ((r - l + 1) % 2 == 0) all = 0;
            else {
                if(l % 2 == 0) all = que(0, 1, n, l, r);
                else all = que2(0, 1, n, l, r);
            }
            cout << all << endl;
        }
        if (c == 1) {
            if (l % 2 == 0) update(0, 1, n, l, r);
            else update2(0, 1, n, l, r);
        }
    }
    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...