Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int tree[2*(1<<17)];
- int ar[1<<17];
- int n, m, N;
- int comb(int a, int b, int level){
- if((N - level) % 2 == 0)
- return a | b;
- return a ^ b;
- }
- int build(int i, int l, int r, int level){
- if(r == l)
- return tree[i] = ar[l];
- int mid = (l + r) / 2;
- return tree[i] = comb(build(2*i, l, mid, level+1), build(2*i+1, mid+1, r, level+1), level);
- }
- int query(int i, int l, int r, int p, int b, int level){
- if(r == l)
- return tree[i] = b;
- int mid = (l + r) / 2;
- if(p <= mid)
- return tree[i] = comb(query(2*i, l, mid, p, b, level+1), tree[2*i+1], level);
- else
- return tree[i] = comb(query(2*i+1, mid+1, r, p, b, level+1), tree[2*i], level);
- }
- int main(){
- scanf("%d%d", &n, &m);
- N = n;
- n = 1 << n;
- for(int i=0;i<n;i++){
- scanf("%d", &ar[i]);
- }
- build(1, 0, n-1, 1);
- /*for(int i=1;i<2*n;i++){
- printf("%d ", tree[i]);
- }*/
- for(int i=1;i<=m;i++){
- int p, b;
- scanf("%d%d", &p, &b);
- printf("%d\n", query(1, 0, n, p, b, 1));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement