#include<iostream>
#include<math.h>
using namespace std;

void build(int arr[], int s, int e, int tree[], int index){
    if(s==e){
        tree[index] = arr[s];
        return;
    }
    int mid = (s+e)/2;
    build(arr,s,mid,tree,2*index);
    build(arr,mid+1,e,tree,2*index+1);
    
    int times = log2(e-s+1);
    if(times&1){
        tree[index] = (tree[2*index] | tree[2*index+1]);
    }
    else{
        tree[index] = (tree[2*index] ^ tree[2*index+1]);
    }
}
void update(int tree[], int ss, int se, int i ,int inc,int index){
    if(i<ss || i>se){
        return; 
    }
    if(i>ss && i<se ){
        tree[index] = inc;
    }
    int mid = (ss+se)/2;
    update(tree,ss,mid,i,inc,2*index);
    update(tree,ss,mid,i,inc,2*index);
    
    int times = log2(se-ss+1);
    if(times&1){
        tree[index] = (tree[2*index] | tree[2*index+1]);
    }
    else{
        tree[index] = (tree[2*index] ^ tree[2*index+1]);
    }
}
int main(){
    int n,q;
    cin>>n>>q;
    n = pow(2,n);
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    int *tree = new int[4*n+1];
    build(arr,0,n-1,tree,1);
    while(q--){
        int i, inc;
        cin>>i>>inc;
        i--;
        update(tree,0,n-1,i,inc,1);
        cout<<tree[1]<<endl;
    }
return 0;}