// Problem: P6587 超超的序列 加强
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6587
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while('0'>ch||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=2e5*20+5;
int n,m,op,ans,ch[N][2],cnt=1,tag[N],lazy[N],x,y,z;
int sum[N];
void dfs(int x){
if(ch[x][0]) dfs(ch[x][0]);
if(ch[x][1]) dfs(ch[x][1]);
sum[x]+=sum[ch[x][0]]+sum[ch[x][1]];
tag[x]+=tag[ch[x][0]]+tag[ch[x][1]];
}
void pd(int x){
if(!x) {
lazy[x]=0;
return;
}
int k=ch[x][0];
if(lazy[x]){
if(k) lazy[k]+=lazy[x];
if(k) sum[k]+=(lazy[x]*tag[k]);
k=ch[x][1];
if(k) lazy[k]+=lazy[x];
if(k) sum[k]+=(lazy[x]*tag[k]);
lazy[x]=0;
}
}
void dfs(int tmp,int x,int k,int z){
if(!tmp){
lazy[x]+=z;
sum[x]+=(tag[x]*z);
return;
}
pd(x);
// if(a[x]!=-1) a[x]+=z;
dfs(tmp-1,ch[x][k&1],k>>1,z);
sum[x]=sum[ch[x][0]]+sum[ch[x][1]];
}
int dfs(int tmp,int x,int k){
if(!tmp){
return sum[x];
}
pd(x);
// int tmpp=(a[x]!=-1)?a[x]:0;
return dfs(tmp-1,ch[x][k&1],k>>1);
}
signed main() {
// memset(a,-1,sizeof(a));
n=read();m=read();
for(int i=1;i<=n;i++){
int tmp=i,u=1;
while(tmp){
if(!ch[u][tmp&1]) ch[u][tmp&1]=++cnt;
u=ch[u][tmp&1];
tmp>>=1;
}
sum[u]+=read();tag[u]++;
}
dfs(1);
for(int i=1;i<=m;i++){
op=read();
op=(op+ans)%2+1;
if(op==1){
x=read();y=read();z=read();
y=y%(1LL<<x);
dfs(x,1,y,z);
}
else{
x=read();y=read();
y=y%(1LL<<x);
ans=dfs(x,1,y);
cout<<ans<<"\n";
}
}
}
能不能帮忙看看哪里MLE了啊。。