CCCPaste

Untitled

#include 

using namespace std;
const int maxn=200005;
typedef long long ll;
int n, m;
int niza[maxn];
struct node {
    ll value;
    int level;
};
node segment_tree[3 * maxn];
void build_tree(int L, int R, int pos) {
    if(L == R) {
        segment_tree[pos].value = niza[L];
        segment_tree[pos].level = 1;
        return;
    }
    int mid = (L + R) / 2;
    build_tree(L, mid, 2 * pos);
    build_tree(mid + 1, R, 2 * pos + 1);
    segment_tree[pos].level = segment_tree[2 * pos].level + 1;
    
    if(segment_tree[pos].level % 2 == 0) {
        segment_tree[pos].value = (segment_tree[2 * pos].value | segment_tree[2 * pos + 1].value);
    }
    
    else {
        segment_tree[pos].value = (segment_tree[2 * pos].value ^ segment_tree[2 * pos + 1].value);
    }
                                
}
void update(int L, int R, int pos, int idx, ll new_value) {
    if(L == R) {
        segment_tree[pos].value = new_value;
        return;
    }
    int mid = (L + R) / 2;
    if(idx <= mid) {
        update(L, mid, 2 * pos, idx, new_value);
    }
    else {
        update(mid + 1, R,2 * pos + 1, idx, new_value);
    }
    if(segment_tree[pos].level % 2 == 0) {
        segment_tree[pos].value = (segment_tree[2 * pos].value | segment_tree[2 * pos + 1].value);
    }
    
    else {
        segment_tree[pos].value = (segment_tree[2 * pos].value ^ segment_tree[2 * pos + 1].value);
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    n = (1 << n);
    for(int i = 0; i < n; i++) {
        cin >> niza[i];
    }
    build_tree(0, n - 1, 1);
    for(int i = 0; i < m; i++) {
        int id;
        ll v;
        cin >> id >> v;
        id--;
        update(0, n - 1, 1, id, v);
        cout << segment_tree[1].value << endl;
    }
    return 0;
}