Submission #1179726

#TimeUsernameProblemLanguageResultExecution timeMemory
1179726zadniprovskaXORanges (eJOI19_xoranges)C++20
100 / 100
102 ms12936 KiB
#include <bits/stdc++.h>

using namespace std;

#define el '\n'
#define ll long long
#define ld long double
#define ull unsigned long long
#define pll pair<long long, long long>
#define ppll pair< pair<long long, long long>, long long >
#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define all(x) x.begin(), x.end()

const ll DIM = 2e5 + 7;
const ll INF = 1e16;
const ll mod = 1e9 + 7;
const ll maxlog = 20;

ll b1[DIM], b2[DIM], T1[4*DIM], T2[4*DIM];

void build1 (ll v, ll tl, ll tr) {
    if (tl == tr) {
        T1[v] = b1[tl];
        return;
    }

    ll tm = (tl + tr) >> 1;
    build1(2*v+1, tl, tm);
    build1(2*v+2, tm+1, tr);
    T1[v] = T1[2*v+1] ^ T1[2*v+2];
}
void build2 (ll v, ll tl, ll tr) {
    if (tl == tr) {
        T2[v] = b2[tl];
        return;
    }

    ll tm = (tl + tr) >> 1;
    build2(2*v+1, tl, tm);
    build2(2*v+2, tm+1, tr);
    T2[v] = T2[2*v+1] ^ T2[2*v+2];
}

void update1 (ll v, ll tl, ll tr, ll pos, ll val) {
    if (pos < tl || tr < pos) return;

    if (tl == tr) {
        T1[v] = val;
        return;
    }

    ll tm = (tl + tr) >> 1;
    update1(2*v+1, tl, tm, pos, val);
    update1(2*v+2, tm+1, tr, pos, val);
    T1[v] = T1[2*v+1] ^ T1[2*v+2];
}
void update2 (ll v, ll tl, ll tr, ll pos, ll val) {
    if (pos < tl || tr < pos) return;

    if (tl == tr) {
        T2[v] = val;
        return;
    }

    ll tm = (tl + tr) >> 1;
    update2(2*v+1, tl, tm, pos, val);
    update2(2*v+2, tm+1, tr, pos, val);
    T2[v] = T2[2*v+1] ^ T2[2*v+2];
}

ll query1 (ll v, ll tl, ll tr, ll L, ll R) {
    if (R < tl || tr < L) return 0;

    if (L <= tl && tr <= R) return T1[v];

    ll tm = (tl + tr) >> 1;
    return query1(2*v+1, tl, tm, L, R) ^ query1(2*v+2, tm+1, tr, L, R);
}
ll query2 (ll v, ll tl, ll tr, ll L, ll R) {
    if (R < tl || tr < L) return 0;

    if (L <= tl && tr <= R) return T2[v];

    ll tm = (tl + tr) >> 1;
    return query2(2*v+1, tl, tm, L, R) ^ query2(2*v+2, tm+1, tr, L, R);
}

void solve() {

    ll n, nq;
    cin >> n >> nq;

    for (int i=1; i<=n; i++) {
        ll a;
        cin >> a;

        if (i & 1) b1[i] = a;
        else b2[i] = a;
    }

    build1(0, 1, n);
    build2(0, 1, n);

    for (int i=1; i<=nq; i++) {
        ll type, L, R;
        cin >> type >> L >> R;

        if (type == 1) {
            if (L & 1) update1(0, 1, n, L, R);
            else update2(0, 1, n, L, R);
        }
        else {
            if ((R - L + 1) & 1) {
                if (L & 1) cout << query1(0, 1, n, L, R);
                else cout << query2(0, 1, n, L, R);
            }
            else cout << 0;

            if (i != nq) cout << el;
        }
    }


}



signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    //freopen("nocross.in", "r", stdin);
    //freopen("nocross.out", "w", stdout);

    int ntest = 1;
    //cin >> ntest;
    while (ntest--){
        solve();
    }
    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...