Submission #999695

#TimeUsernameProblemLanguageResultExecution timeMemory
999695vjudge1XORanges (eJOI19_xoranges)C++17
100 / 100
100 ms19284 KiB
#pragma GCC optimize("-O3") #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define vl vector<ll> #define vi vector<int> #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define f first #define s second #define pii pair<int, int> #define pll pair<ll, ll> #define pb push_back #define p_b pop_back using namespace std; using namespace __gnu_pbds; typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll sz = 2e5+5; ll a[sz], b[sz], segtree1[4*sz], segtree2[4*sz]; void build(ll v, ll l, ll r) { if(l == r){ segtree1[v] = a[l]; segtree2[v] = b[l]; } else { ll mid = (l + r) / 2; build(2*v, l, mid); build(2*v+1, mid+1, r); segtree1[v] = (segtree1[2*v] ^ segtree1[2*v+1]); segtree2[v] = (segtree2[2*v] ^ segtree2[2*v+1]); } } void update1(ll v, ll l, ll r, ll idx, ll val) { if(l == r) segtree1[v] = val; else { ll mid = (l + r) / 2; if(idx <= mid) update1(2*v, l, mid, idx, val); else update1(2*v+1, mid+1, r, idx, val); segtree1[v] = (segtree1[2*v] ^ segtree1[2*v+1]); } } void update2(ll v, ll l, ll r, ll idx, ll val) { if(l == r) segtree2[v] = val; else { ll mid = (l + r) / 2; if(idx <= mid) update2(2*v, l, mid, idx, val); else update2(2*v+1, mid+1, r, idx, val); segtree2[v] = (segtree2[2*v] ^ segtree2[2*v+1]); } } ll findans1(ll v, ll l, ll r, ll tl, ll tr) { if(tl > tr) return 0; if(l == tl && r == tr) return segtree1[v]; else { ll mid = (l + r) / 2; ll lans = findans1(2*v, l, mid, tl, min(mid, tr)); ll rans = findans1(2*v+1, mid+1, r, max(mid+1, tl), tr); return (lans ^ rans); } } ll findans2(ll v, ll l, ll r, ll tl, ll tr) { if(tl > tr) return 0; if(l == tl && r == tr) return segtree2[v]; else { ll mid = (l + r) / 2; ll lans = findans2(2*v, l, mid, tl, min(mid, tr)); ll rans = findans2(2*v+1, mid+1, r, max(mid+1, tl), tr); return (lans ^ rans); } } void solve() { ll n, q, i, a1 = 1, b1 = 1; cin >> n >> q; for(i = 1; i <= n; i++) { ll x; cin >> x; if(i % 2) a[a1++] = x; else b[b1++] = x; } build(1, 1, n); while(q--) { ll type, l, r; cin >> type >> l >> r; if(type == 2) { if((r - l + 1) % 2) { if(l%2) { if(r % 2 == 0) r--; cout << findans1(1, 1, n, (l+1)/2, (r+1)/2) << "\n"; } else { if(r % 2 == 1) r--; cout << findans2(1, 1, n, l/2, r/2) << "\n"; } } else cout << "0\n"; } else { if(l % 2) update1(1, 1, n, (l+1)/2, r); else update2(1, 1, n, l/2, r); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll tests = 1; //cin >> tests; while(tests--) { solve(); } }
#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...