#include <bits/stdc++.h>
using namespace std;
long long a[300005], c[1200005], flag[25];
void build(long long p, long long l, long long r) {
  if (l == r) {
    c[p] = a[l];
    return;
  }
  long long mid = (l + r) / 2;
  build(p * 2, l, mid);
  build(p * 2 + 1, mid + 1, r);
  c[p] = c[p * 2] + c[p * 2 + 1];
}
void change(long long p, long long l, long long r, long long x, long long k,
            long long d) {
  if (x > r || x < l) return;
  if (l == r) {
    c[p] = k;
    return;
  }
  long long mid = (l + r) / 2;
  if (flag[d] == 0) {
    change(p * 2, l, mid, x, k, d - 1);
    change(p * 2 + 1, mid + 1, r, x, k, d - 1);
  } else {
    change(p * 2 + 1, l, mid, x, k, d - 1);
    change(p * 2, mid + 1, r, x, k, d - 1);
  }
  c[p] = c[p * 2] + c[p * 2 + 1];
}
long long ask(long long p, long long l, long long r, long long L, long long R,
              long long d) {
  if (L > r || R < l) return 0;
  if (L <= l && R >= r) return c[p];
  long long mid = (l + r) / 2;
  long long ans = 0;
  if (flag[d] == 0) {
    ans += ask(p * 2, l, mid, L, R, d - 1);
    ans += ask(p * 2 + 1, mid + 1, r, L, R, d - 1);
  } else {
    ans += ask(p * 2 + 1, l, mid, L, R, d - 1);
    ans += ask(p * 2, mid + 1, r, L, R, d - 1);
  }
  return ans;
}
int main() {
  long long n, q;
  cin >> n >> q;
  long long N = (1ll << n);
  for (long long i = 1; i <= N; i++) {
    cin >> a[i];
  }
  build(1, 1, N);
  for (long long i = 1; i <= q; i++) {
    long long o;
    cin >> o;
    if (o == 1) {
      long long x, k;
      cin >> x >> k;
      change(1, 1, N, x, k, n);
    } else if (o == 2) {
      long long k;
      cin >> k;
      for (long long i = 0; i <= k; i++) flag[i] ^= 1;
    } else if (o == 3) {
      long long k;
      cin >> k;
      flag[k + 1] ^= 1;
    } else if (o == 4) {
      long long l, r;
      cin >> l >> r;
      cout << ask(1, 1, N, l, r, n) << endl;
    }
  }
}
