Submission #1268151

#TimeUsernameProblemLanguageResultExecution timeMemory
1268151haithamcoderXORanges (eJOI19_xoranges)C++20
100 / 100
86 ms7720 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MOD = 1000000007;
const ll LOG = 31;

#define db(x) cerr << #x << " = " << x << " | "
#define dbg(x) cerr << #x << " = " << x << "\n"

#define Algerian ios::sync_with_stdio(0);
#define OI cin.tie(NULL);

ll n, q;

void build(vector<ll>& f, bool par, vector<ll> a) {
    for (ll i = !par; i <= n; i += 2) {
        a[i] = 0;
    }

    for (ll i = 1; i <= n; i++) {
        f[i] ^= a[i];

        if (i + (i & (-i)) <= n) f[i + (i & (-i))] ^= f[i];
    }

    return;
}

ll sum(vector<ll>& f, ll idx) {
    ll res= 0;

    for (ll i = idx; i > 0; i -= i & (-i)) {
        res ^= f[i];
    }

    return res;
}

ll range_sum(vector<ll>& f, ll l, ll r) {
    return sum(f, r) ^ sum(f, l - 1);
}

void update(vector<ll>& f, ll idx, ll val) {
    for (ll i = idx; i <= n; i += i & (-i)) {
        f[i] ^= val;
    }

    return;
}

int main() {
    Algerian OI

    cin >> n >> q;

    vector<ll> a(n + 1), even(n + 1), odd(n + 1);
    for (ll i = 1; i <= n; i++) cin >> a[i];
    
    build(even, 0, a);
    build(odd, 1, a);

    while (q--) {
        ll type, u, v;
        cin >> type >> u >> v;

        if (type == 1) {
            ll val = v ^ a[u];
            a[u] ^= val;
            if (u & 1) {
                update(odd, u, val);
            } else {
                update(even, u, val);
            }
        } else {
            ll l = u, r = v;
            if ((l & 1) ^ (r & 1)) {
                cout << "0\n";
                continue;
            }

            if (l & 1) {
                cout << range_sum(odd, l, r) << "\n";
            } else {
                cout << range_sum(even, l, r) << "\n";
            }
        }
    }

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