Submission #1299169

#TimeUsernameProblemLanguageResultExecution timeMemory
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...