#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffffffffffff
bool space=0;
long long read(){
long long x=0;
int f=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
if(c==' ')space=1;
else space=0;
return x*f;
}
ll tree[200001<<2];
ll lazy[200001<<2];
int n,m;
void pushup(ll &a,const ll &a1,const ll &a2){
a=min(a1,a2);
}
void build(int x,int l,int r){
if(l==r){
tree[x]=read();
}else{
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(tree[x],tree[x<<1],tree[x<<1|1]);
}
}
void pushdown(int x,int l,int r){
if(lazy[x]){
int mid=(l+r)>>1;
lazy[x<<1]=lazy[x];
lazy[x<<1|1]=lazy[x];
tree[x<<1]+=lazy[x];
tree[x<<1|1]+=lazy[x];
lazy[x]=0;
}
}
void update(int x,int l,int r,int L,int R,ll val){
if(L<=l&&r<=R){
tree[x]+=val;
lazy[x]+=val;
}else{
int mid=(l+r)>>1;
pushdown(x,l,r);
if(L<=mid)
update(x<<1,l,mid,L,R,val);
if(R>mid)
update(x<<1|1,mid+1,r,L,R,val);
pushup(tree[x],tree[x<<1],tree[x<<1|1]);
}
}
ll query(int x,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tree[x];
}else{
int mid=(l+r)>>1;
pushdown(x,l,r);
ll res=inf;
if(L<=mid){
pushup(res,res,query(x<<1,l,mid,L,R));
}
if(R>mid){
pushup(res,res,query(x<<1|1,mid+1,r,L,R));
}
return res;
}
}
int main(){
n=read();
build(1,1,n);
m=read();
int ls,rs;
ll vv;
for(int i=1;i<=m;i++){
ls=read();
rs=read();
ls++;
rs++;
if(space){
vv=read();
if(ls>rs){
update(1,1,n,ls,n,vv);
update(1,1,n,1,rs,vv);
}else{
update(1,1,n,ls,rs,vv);
}
}else{
if(ls>rs){
printf("%lld\n",min(query(1,1,n,ls,n),query(1,1,n,1,rs)));
}else{
printf("%lld\n",query(1,1,n,ls,rs));
}
}
}
return 0;
}