#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream in("baruri.in");
ofstream out("baruri.out");
const int NMAX=1e5+10;
int aint[4*NMAX],v[NMAX],poz,val, start,final,sum;
string s;
void build(int node, int st, int dr){
if(st==dr){
aint[node]=v[st];
return;
}
build(node<<1, st, (st+dr)>>1);
build(node<<1|1,(st+dr)/2+1,dr);
aint[node]=aint[node<<1]+aint[node<<1|1];
}
void update(int node,int st,int dr){
if(st==dr){
aint[node]+=val;
return;
}
int mid=(st+dr)>>1;
if(poz<=mid) update(node<<1, st,mid);
else update(node<<1|1,mid+1, dr);
aint[node]=aint[node<<1]+aint[node<<1|1];
}
void query(int node,int st,int dr){
if(start<=st && dr<=final) {
sum+=aint[node];
return ;
}
int mid=(st+dr)/2;
if(start<=mid) query(node<<1, st,mid);
if(final>mid) query(node<<1|1, mid+1, dr);
}
char c[3000005];
void solve(){
int n;
in>>n;
in.get();
in.getline(c,3000000);
int nr=0;
poz=0;
for(int i=0;c[i];i++){
if(c[i]==' '){
poz++;
val=nr;
v[poz]=nr;
nr=0;
}
else
nr=nr*10+(c[i]-'0');
}
v[++poz]=nr;
int m,tip,b1;
build(1,1,n);
in>>m;
for(int i=1;i<=m;i++){
in>>tip;
if(tip==0){
in>>poz>>val;
start=max(1,poz-val);
final=min(n,poz+val);
sum=0;
query(1,1,n);
sum-=v[poz];
s+= to_string(sum)+'\n';
}
else if(tip==1){
in>>val>>poz;
update(1,1,n);
}
else if(tip==2){
in>>val>>poz;
val=-val;
update(1,1,n);
}
else{
in>>val>>poz>>b1;
val=-val;
update(1,1,n);
v[poz]+=val;
val=-val;
poz=b1;
update(1,1,n);
v[poz]+=val;
}
}
out<<s;
s.clear();
}
int main() {
int k;
for(in>>k;k>0;k--)
solve();
return 0;
}