Submission #1176444

#TimeUsernameProblemLanguageResultExecution timeMemory
1176444Albara_AbdulhafithXORanges (eJOI19_xoranges)C++20
100 / 100
76 ms9288 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define fastIO ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define take(x) for(auto& el : x){cin >> el;} #define give(x) for(auto& el : x){cout << el << ' ';}cout << '\n'; #define vi vector<int> #define vvi vector<vi> #define vll vector<ll> #define vvll vector<vll> #define rep(i, x) for(int i = 0; i < x; i++) #define sz(x) ll(x.size()) const ll modu = 998244353ll; ll mod(ll x, ll md = modu){ return (((x % md) + md ) % md); } struct segt{ int n; vector<int> A; vector<int> treeeven; vector<int> treeodd; segt(int sz, vector<int>& a){ n = sz; A = a; treeeven.resize(4 * n); treeodd.resize(4 * n); buildeven(); buildodd(); } int left(int x){return (x << 1) + 1;} int right(int x){return (x << 1) + 2;} int mid(int l, int r){return ((l + r) >> 1);} void buildeven_help(int p, int l, int r){ if(l == r){ if(l & 1){ treeeven[p] = A[l]; } else{ treeeven[p] = 0; } return; } buildeven_help(left(p), l, mid(l, r)); buildeven_help(right(p), mid(l, r) + 1, r); treeeven[p] = (treeeven[left(p)] ^ treeeven[right(p)]); } void buildodd_help(int p, int l, int r){ if(l == r){ if(l & 1){ treeodd[p] = 0; } else{ treeodd[p] = A[l]; } return; } buildodd_help(left(p), l, mid(l, r)); buildodd_help(right(p), mid(l, r) + 1, r); treeodd[p] = (treeodd[left(p)] ^ treeodd[right(p)]); } void updateeven_help(int p, int l, int r, int id, int val){ if(id < l or id > r){return;} if(l == r and l == id){ treeeven[p] = val; return; } updateeven_help(left(p), l, mid(l, r), id, val); updateeven_help(right(p), mid(l, r) + 1, r, id, val); treeeven[p] = (treeeven[left(p)] ^ treeeven[right(p)]); } void updateodd_help(int p, int l, int r, int id, int val){ if(id < l or id > r){return;} if(l == r and l == id){ treeodd[p] = val; return; } updateodd_help(left(p), l, mid(l, r), id, val); updateodd_help(right(p), mid(l, r) + 1, r, id, val); treeodd[p] = (treeodd[left(p)] ^ treeodd[right(p)]); } int even_help(int p, int l, int r, int x, int y){ if(y < l or x > r){return 0;} if(x <= l and y >= r){return treeeven[p];} int p1 = even_help(left(p), l, mid(l, r), x, y); int p2 = even_help(right(p), mid(l, r) + 1, r, x, y); return (p1 ^ p2); } int odd_help(int p, int l, int r, int x, int y){ if(y < l or x > r){return 0;} if(x <= l and y >= r){return treeodd[p];} int p1 = odd_help(left(p), l, mid(l, r), x, y); int p2 = odd_help(right(p), mid(l, r) + 1, r, x, y); return (p1 ^ p2); } void buildeven(){ buildeven_help(0, 0, n - 1); } void buildodd(){ buildodd_help(0, 0, n - 1); } void updateeven(int id, int val){ updateeven_help(0, 0, n - 1, id, val); } void updateodd(int id, int val){ updateodd_help(0, 0, n - 1, id, val); } int even(int x, int y){ return even_help(0, 0, n - 1, x, y); } int odd(int x, int y){ return odd_help(0, 0, n - 1, x, y); } }; void solve(){ int n, q; cin >> n >> q; vector<int> a(n); take(a); segt segtree(n, a); int op, l, r; for(int i = 0; i < q; i++){ cin >> op >> l >> r; if(op == 1){ if(l & 1){ segtree.updateodd(l - 1, r); } else{ segtree.updateeven(l - 1, r); } } else{ if((r - l) & 1){ cout << 0 << '\n'; continue; } if(l & 1){ cout << segtree.odd(l - 1, r - 1) << '\n'; } else{ cout << segtree.even(l - 1, r - 1) << '\n'; } } //give(segtree.treeodd); //give(segtree.treeeven); } } int main(){ fastIO int tc = 1; //cin >> tc; while(tc--){ 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...