Submission #1296953

#TimeUsernameProblemLanguageResultExecution timeMemory
1296953chithanhnguyenXORanges (eJOI19_xoranges)C++20
100 / 100
93 ms18784 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ld long double #define pii pair<int, int> #define fi first #define se second #define __builtin_popcount __builtin_popcountll #define all(x) (x).begin(), (x).end() #define BIT(x, i) (((x) >> (i)) & 1) #define debug(a, l, r) for (int i = (l); i <= (r); ++i) cout << (a)[i] << ' '; cout << '\n'; struct SegmentTree{ int n; vector<int> st; void build(int id, int l, int r, vector<int> &a) { if (l == r) { st[id] = a[l]; return; } int mid = (l + r) >> 1; build(id << 1, l, mid, a); build((id << 1) | 1, mid + 1, r, a); st[id] = (st[id << 1] ^ st[(id << 1) | 1]); } SegmentTree() { } SegmentTree(int n, vector<int> &a) : n(n) { st.resize(4 * n + 5, 0ll); build(1, 1, n, a); } void update(int id, int l, int r, int pos, int val) { if (l > pos || r < pos) return; if (l == r) { st[id] = val; return; } int mid = (l + r) >> 1; update(id << 1, l, mid, pos, val); update((id << 1) | 1, mid + 1, r, pos, val); st[id] = (st[id << 1] ^ st[(id << 1) | 1]); } int get(int id, int l, int r, int u, int v) { if (l > v || r < u) return 0; if (l >= u && r <= v) return st[id]; int mid = (l + r) >> 1; int get1 = get(id << 1, l, mid, u, v); int get2 = get((id << 1) | 1, mid + 1, r, u, v); return (get1 ^ get2); } void update(int l, int r) { update(1, 1, n, l, r); } int get(int l, int r) { return get(1, 1, n, l, r); } }; const int MAXN = 2e5 + 5; int n, q, a[MAXN]; signed main() { #ifdef NCTHANH freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> q; for (int i = 1; i <= n; ++i) cin >> a[i]; vector<int> val_odd(n + 5), val_even(n + 5); for (int i = 1; i <= n; ++i) { (i & 1 ? val_odd : val_even)[i] = a[i]; } SegmentTree seg_odd(n, val_odd); SegmentTree seg_even(n, val_even); while (q--) { int type; cin >> type; if (type == 1) { int pos, val; cin >> pos >> val; if (pos & 1) seg_odd.update(pos, val); else seg_even.update(pos, val); } else { int l, r; cin >> l >> r; int len = r - l + 1; if (len & 1) { int res = 0; if (l & 1) res = seg_odd.get(l, r); else res = seg_even.get(l, r); cout << res << '\n'; } else cout << 0 << '\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...