Submission #791311

#TimeUsernameProblemLanguageResultExecution timeMemory
791311kristo31XORanges (eJOI19_xoranges)C++17
100 / 100
88 ms16124 KiB
#include <bits/stdc++.h>

using namespace std;
using namespace std::chrono;

#define gc getchar_unlocked
#define pii pair<long long, long long>
using ll = long long;

const int maxN = 2e5 + 10, maxM = 1e5 + 10, MAX = 1e7;
const ll maxScore = 4294967295;
const ll mod = 998244353;
const double pi = acos(-1.0);
const double e = exp(1.0);
const ll naught = -100001;
const ll maxT = ceil(sqrt(maxN)) + 1;
const ll root = 15311432;
const ll root_1 = 469870224;
const ll root_pw = (1 << 23);
const int K = 19;

ll seg[4 * maxN][2], arr[maxN];

template <typename T> void fastInt(T& angka) {
    T kali = 1; angka = 0; char input = gc();
    while (!isdigit(input)) { if (input == '-') kali = -1; input = gc(); }
    while (isdigit(input)) angka = (angka << 3) + (angka << 1) + input - 48, input = gc();
    angka *= kali;
}

void fastStr(string& str) {
    str = "";
    char c = '0';
    while ((c = gc()) && (c != -1 && c != '\n' && c != '\t' && c != '\r')) {
        str += c;
    }
}

ll powMod(ll x, ll y, ll p){
    ll res = 1;
    x %= p;
    if(!x) return 0;
    while (y > 0){
        if (y & 1) res = ((res % p) * (x % p)) % p;
        y = y >> 1;
        x = ((x % p) * (x % p)) % p;
    }
    return res;
}

ll inverseMod(ll x, ll p){
    return powMod(x, p - 2, p);
}

void build(ll ind, ll l, ll r){
    if(l > r) return;
    if(l == r){
        seg[ind][l & 1] = arr[l];
        return;
    }
    ll mid = (l + r) / 2;
    build(2 * ind, l, mid);
    build(2 * ind + 1, mid + 1, r);
    seg[ind][0] = seg[2 * ind][0] ^ seg[2 * ind + 1][0];
    seg[ind][1] = seg[2 * ind][1] ^ seg[2 * ind + 1][1];
}

void upd(ll ind, ll l, ll r, ll i){
    if(l > r) return;
    if(r < i || i < l) return;
    if(l == r){
        assert(l == i);
        seg[ind][l & 1] = arr[l];
        return;
    }
    ll mid = (l + r) / 2;
    upd(2 * ind, l, mid, i);
    upd(2 * ind + 1, mid + 1, r, i);
    seg[ind][0] = seg[2 * ind][0] ^ seg[2 * ind + 1][0];
    seg[ind][1] = seg[2 * ind][1] ^ seg[2 * ind + 1][1];
}

ll query(ll ind, ll l, ll r, ll tl, ll tr, ll x){
    if(l > r) return 0;
    if(r < tl || tr < l) return 0;
    if(tl <= l && r <= tr) return seg[ind][x];
    ll mid = (l + r) / 2;
    return query(2 * ind, l, mid, tl, tr, x) ^ query(2 * ind + 1, mid + 1, r, tl, tr, x);
}

inline void solve(){
    ll n, q;
    fastInt(n); fastInt(q);
    for(int i = 1; i <= n; ++i) fastInt(arr[i]);
    build(1, 1, n);
    for(int i = 1; i <= q; ++i){
        ll typ; fastInt(typ);
        if(typ == 1){
            ll i, x;
            fastInt(i); fastInt(x);
            arr[i] = x;
            upd(1, 1, n, i);
        }else{
            ll l, r;
            fastInt(l); fastInt(r);
            if((r - l + 1) % 2 == 0) cout << "0\n";
            else cout << query(1, 1, n, l, r, l & 1) << '\n';
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    auto beg = high_resolution_clock::now();
    int t; t = 1;
    while(t--) solve();
    auto en = high_resolution_clock::now();
    auto dur = duration_cast<microseconds>(en - beg);
    //cout << dur.count() << 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...