Untitled
code// Created by: G Gautham Krishna #include <bits/stdc++.h> using namespace std; // shortforms #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define all(x) (x).begin(),(x).end() #define srt(v) sort(v.begin(),v.end()) #define rev(v) reverse(v.begin(),v.end()) #define lb(v,x) lower_bound(v.begin(),v.end(),x) #define ub(v,x) upper_bound(v.begin(),v.end(),x) #define cpy(v2,v1) v2.assign(v1.begin(),v1.end()) #define maxv(a) *max_element(a.begin(), a.end()) #define minv(a) *min_element(a.begin(), a.end()) #define ff first #define ss second #define endl "\n" //type definitions typedef long long ll; typedef unsigned long long ull; typedef long double lld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<ll> vll; //constants const long long int inf = 1e18; const int mod = 1000000007; #define pi 3.141592653589793238462 struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; //graphs //const int N=1e5+2; //std::vector<int> vis(N,0); //std::vector<int> adj[N]; // debugger #ifndef ONLINE_JUDGE #define debug(x) cerr << #x <<" "; _print(x); cerr << endl; #else #define debug(x) #endif void _print(ll t) {cerr << t;} void _print(int t) {cerr << t;} void _print(string t) {cerr << t;} void _print(char t) {cerr << t;} void _print(lld t) {cerr << t;} void _print(double t) {cerr << t;} void _print(ull t) {cerr << t;} template <class T, class V> void _print(pair <T, V> p); template <class T> void _print(vector <T> v); template <class T> void _print(set <T> v); template <class T, class V> void _print(map <T, V> v); template <class T> void _print(multiset <T> v); template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";} template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";} template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";} template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";} template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";} template <class T, class V> void _print(multimap <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";} mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ll gcd(ll a, ll b) {if (b > a) {return gcd(b, a);} if (b == 0) {return a;} return gcd(b, a % b);} ll binexp(ll a, ll b, ll mod) {ll res = 1; while (b > 0) {if (b & 1)res = (res * a) % mod; a = (a * a) % mod; b = b >> 1;} return res;} void extendgcd(ll a, ll b, ll*v) {if (b == 0) {v[0] = 1; v[1] = 0; v[2] = a; return ;} extendgcd(b, a % b, v); ll x = v[1]; v[1] = v[0] - v[1] * (a / b); v[0] = x; return;} //pass an arry of size1 3 ll mminv(ll a, ll b) {ll arr[3]; extendgcd(a, b, arr); return arr[0];} //for non prime b ll mminvprime(ll a, ll b) {return binexp(a, b - 2, b);} bool revsort(ll a, ll b) {return a > b;} ll combination(ll n, ll r, ll m, vector<ll>& fact, vector<ll>& ifact) {ll val1 = fact[n]; ll val2 = ifact[n - r]; ll val3 = ifact[r]; return (((val1 * val2) % m) * val3) % m;} void google(int t) {cout << "Case #" << t << ": ";} vector<ll> sievefn(int n) {int*arr = new int[n + 1](); vector<ll> vect; for (int i = 2; i <= n; i++)if (arr[i] == 0) {vect.push_back(i); for (int j = 2 * i; j <= n; j += i)arr[j] = 1;} return vect;} ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;} ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;} ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;} ll mod_div(ll a, ll b, ll m) {a = a % m; b = b % m; return (mod_mul(a, mminvprime(b, m), m) + m) % m;} //only for prime m ll phin(ll n) {ll number = n; if (n % 2 == 0) {number /= 2; while (n % 2 == 0) n /= 2;} for (ll i = 3; i <= sqrt(n); i += 2) {if (n % i == 0) {while (n % i == 0)n /= i; number = (number / i * (i - 1));}} if (n > 1)number = (number / n * (n - 1)) ; return number;} //O(sqrt(N)) ll getRandomNumber(ll l, ll r) {return uniform_int_distribution<ll>(l, r)(rng);} template<typename T> void read(T &x){ cin>>x; } template<typename T,typename T1> void read(pair<T,T1> &p){ cin>>p.ff>>p.ss; } template<typename T> void read(vector<T> &a){ for(auto &i:a)read(i); } template<typename T,typename T1> void read(vector<pair<T,T1>>&a){ for(auto &i:a)read(i); } template<typename T> void print(T &x){ cout<<x; } template<typename T,typename T1> void print(pair<T,T1> &p){ cout<<p.ff<<" "<<p.ss; } template<typename T> void print(vector<T> &a){ for(auto &i:a)print(i); } template<typename T,typename T1> void print(vector<pair<T,T1>>&a){ for(auto &i:a)print(i); } template<typename Node, typename Update> struct SegTree { vector<Node> tree; vector<ll> arr; // type may change int n; int s; SegTree(int a_len, vector<ll> &a) { // change if type updated arr = a; n = a_len; s = 1; while(s < 2 * n){ s = s << 1; } tree.resize(s); fill(all(tree), Node()); build(0, n - 1, 1); } void build(int start, int end, int index) // Never change this { if (start == end) { tree[index] = Node(arr[start], start, end); return; } int mid = (start + end) / 2; build(start, mid, 2 * index); build(mid + 1, end, 2 * index + 1); tree[index].merge(tree[2 * index], tree[2 * index + 1]); } void update(int start, int end, int index, int query_index, Update &u) // Never Change this { if (start == end) { u.apply(tree[index]); return; } int mid = (start + end) / 2; if (mid >= query_index) update(start, mid, 2 * index, query_index, u); else update(mid + 1, end, 2 * index + 1, query_index, u); tree[index].merge(tree[2 * index], tree[2 * index + 1]); } Node query(int start, int end, int index, int left, int right) { // Never change this if (start > right || end < left) return Node(); if (start >= left && end <= right) return tree[index]; int mid = (start + end) / 2; Node l, r, ans; l = query(start, mid, 2 * index, left, right); r = query(mid + 1, end, 2 * index + 1, left, right); ans.merge(l, r); return ans; } void make_update(int index, ll val) { // pass in as many parameters as required Update new_update = Update(val); // may change update(0, n - 1, 1, index, new_update); } Node make_query(int left, int right) { return query(0, n - 1, 1, left, right); } }; struct Node1 { ll val; // may change ll l1,r1; Node1() { // Identity element val = 0; // may change l1=-1;r1=-1; } Node1(ll p1, ll l2, ll r2) { // Actual Node val = p1; // may change l1=l2; r1=r2; } void merge(Node1 &l, Node1 &r) { // Merge two child nodes l1=min(l.l1, r.l1); r1=max(l.r1, r.r1); int cnt=0; ll v=(r1-l1+1); while(v>1){ cnt++; v/=2; } if(cnt%2==0){ val=(l.val|r.val); } else{ val=(l.val^r.val); } } }; struct Update1 { ll val; // may change Update1(ll p1) { // Actual Update val = p1; // may change } void apply(Node1 &a) { // apply update to given node a.val = val; // may change } }; int main() { #ifndef ONLINE_JUDGE freopen("inputf.in", "r", stdin); freopen("outputf.in", "w", stdout); freopen("Error.txt", "w", stderr); auto begin = std::chrono::high_resolution_clock::now(); #endif //fast io ios_base::sync_with_stdio(false); cin.tie(NULL); //main code starts here ll n,m; cin>>n>>m; vll a((1<<n)); read(a); debug(a) SegTree<Node1, Update1> tree(a.size(), a); while(m--){ ll p,b; cin>>p>>b; tree.make_update(p-1,b); cout<<tree.make_query(0,a.size()-1).val<<endl; } #ifndef ONLINE_JUDGE auto end = std::chrono::high_resolution_clock::now(); cerr << setprecision(4) << fixed; cerr << "Execution time: " << std::chrono::duration_cast<std::chrono::duration<double>>(end - begin).count() << " seconds" << endl; #endif return 0; }
Leave a Comment