제출 #1299169

#제출 시각아이디문제언어결과실행 시간메모리
1299169miyamae_nonoaXORanges (eJOI19_xoranges)C++20
100 / 100
367 ms11400 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <numeric> 
#include <cassert>
#include <sstream>
#include <climits>
using namespace std;
using ll = long long;
const int maxn = 2e5 + 5;
ll a[maxn];
ll stOdd[4*maxn], stEven[4*maxn];
int n, q;
void build(int id, int start, int end) {
    if (start == end) {
        if (start % 2 == 1) stOdd[id] = a[start];
        else stOdd[id] = 0;
        if (start % 2 == 0) stEven[id] = a[start];
        else stEven[id] = 0;
        return;
    }
    int mid = (start + end) / 2;
    build(id*2, start, mid);
    build(id*2+1, mid+1, end);
    stOdd[id] = stOdd[id*2] ^ stOdd[id*2+1];
    stEven[id] = stEven[id*2] ^ stEven[id*2+1];
}
void update(int id, int start, int end, int pos, ll val) {
    if (start == end) {
        a[pos] = val;
        if (start % 2 == 1) stOdd[id] = val;
        else stOdd[id] = 0;
        if (start % 2 == 0) stEven[id] = val;
        else stEven[id] = 0;
        return;
    }
    int mid = (start + end) / 2;
    if (pos <= mid) update(id*2, start, mid, pos, val);
    else update(id*2+1, mid+1, end, pos, val);
    stOdd[id] = stOdd[id*2] ^ stOdd[id*2+1];
    stEven[id] = stEven[id*2] ^ stEven[id*2+1];
}
ll queryOdd(int id, int start, int end, int l, int r) {
    if (r < start || end < l) return 0;
    if (l <= start && end <= r) return stOdd[id];
    int mid = (start + end) / 2;
    ll p1 = queryOdd(2 * id, start, mid, l, r);
    ll p2 = queryOdd(2 * id +1, mid+1, end, l, r);
    return p1 ^ p2;
}
ll queryEven(int id, int start, int end, int l, int r) {
    if (r < start || end < l) return 0;
    if (l <= start && end <= r) return stEven[id];
    int mid = (start + end) / 2;
    ll p1 = queryEven(2 * id, start, mid, l, r);
    ll p2 = queryEven(2 * id + 1, mid+1, end, l, r);
    return p1 ^ p2;
}
int main() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];
    build(1, 1, n);
    while(q--) {
        int type; 
        cin >> type;
        if (type == 1) {
            int x; ll y; 
            cin >> x >> y;
            update(1, 1, n, x, y);
        } else {
            int l, r;
            cin >> l >> r;
            ll ans = 0;
            if ((r-l+1) % 2 == 1) {
                if (l % 2 == 1) ans = queryOdd(1, 1, n, l, r);
                if (l % 2 == 0) ans = queryEven(1, 1, n, l, r);
            }
            cout << ans << "\n";
        }
    }
}
#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...