#include <bits/stdc++.h>
using namespace std;
long long segt[((long long)1 << 19) + 5];
long long constr(long long l, long long r, long long mas[], long long pos) {
  if (l == r) {
    segt[pos] = mas[l];
    return 1;
  } else {
    long long mid = (l + r) / 2;
    long long bij = constr(l, mid, mas, pos * 2 + 1);
    constr(mid + 1, r, mas, pos * 2 + 2);
    if (bij % 2)
      segt[pos] = (segt[pos * 2 + 1] | segt[pos * 2 + 2]);
    else
      segt[pos] = (segt[pos * 2 + 1] ^ segt[pos * 2 + 2]);
    return bij + 1;
  }
}
long long upd(long long l, long long r, long long atr, long long val,
              long long pos) {
  if (r < atr || l > atr) return -1;
  if (l == r) {
    segt[pos] = val;
    return 1;
  } else {
    long long mid = (l + r) / 2;
    long long bij = upd(l, mid, atr, val, pos * 2 + 1);
    long long bij2 = upd(mid + 1, r, atr, val, pos * 2 + 2);
    if (bij == -1) swap(bij, bij2);
    if (bij % 2)
      segt[pos] = (segt[pos * 2 + 1] | segt[pos * 2 + 2]);
    else
      segt[pos] = (segt[pos * 2 + 1] ^ segt[pos * 2 + 2]);
    return bij + 1;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  n = ((long long)1 << n);
  long long mas[n];
  for (long long i = 0; i < n; i++) cin >> mas[i];
  constr(0, n - 1, mas, 0);
  while (m--) {
    long long atr, val;
    cin >> atr >> val;
    atr--;
    upd(0, n - 1, atr, val, 0);
    cout << segt[0] << "\n";
  }
  return 0;
}
