#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1100010;
ll n,q;
ll v[N];
ll op,x,y;
struct Tree{
ll l,r,num,sum;
} t[5*N+10];
ll read() {
ll x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
void write(ll t){
if(t>=10) write(t/10);
putchar(t%10+48);
}
bool check(ll x,ll y){
if(x|y==y) return true;
return x&y;
}
void build(ll q,ll L,ll R) {
if(q>4*N+10)
{
return;
}
t[q].l=L;
t[q].r=R;
if(L==R) {
t[q].num=v[L];
t[q].sum=L;
return ;
}
ll mid=(L+R)/2;
build(q<<1,L,mid);
build(q<<1|1,mid+1,R);
t[q].sum=t[q<<1].sum|t[q<<1|1].sum;
t[q].num=t[q<<1].num+t[q<<1|1].num;
}
void change(ll q,ll s,ll d) {
if(q>4*N+10)
{
return;
}
if(t[q].l>=s&&t[q].r<=s) {
t[q].num=d;
return ;
}
ll mid=(t[q].l+t[q].r)/2;
if(s<=mid) change(q<<1,s,d);
if(s>mid) change(q<<1|1,s,d);
t[q].num=t[q<<1].num+t[q<<1|1].num;
}
ll ask(ll q,ll s) {
if(q>4*N+10)
{
return 0;
}
if((s|t[q].sum)==s) {
return t[q].num;
}
if(t[q].l==t[q].r) {
return 0;
}
ll ans=0;
if(check(t[q<<1].sum,s)){
ans+=ask(q<<1,s);
}
if(check(t[q<<1|1].sum,s)){
ans+=ask(q<<1|1,s);
}
return ans;
}
signed main() {
n=read();
q=read();
n=1<<n;
for(ll i=0; i<n; i++) {
v[i]=read();
}
build(1,0,n-1);
while(q--) {
op=read();
x=read();
if(op==1) {
write(ask(1,x));
puts("");
} else if(op==2) {
y=read();
change(1,x,y);
}
}
}