注意本题读入数据长度不确定的处理方法
#include<bits/stdc++.h>
using namespace std;
const int N=1e6,INF=1e14;
typedef long long ll;
struct node{
int l,r;
ll v;
ll lazy;
}tr[N];
int n,m;
ll a[N];
void pushup(int u){
tr[u].v=min(tr[u<<1].v,tr[(u<<1)+1].v);
}
void pushdown(int u){
int lazy=tr[u].lazy;
tr[u].lazy=0;
tr[u<<1].lazy+=lazy,tr[(u<<1)+1].lazy+=lazy;
tr[u<<1].v+=lazy,tr[u<<1|1].v+=lazy;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r){
tr[u].v=a[l];
return;
}
int mid=l+r>>1;
build(u<<1,l,mid),build((u<<1)+1,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int d){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].v+=d;
tr[u].lazy+=d;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify(u<<1,l,r,d);
if(r>mid)modify((u<<1)+1,l,r,d);
pushup(u);
}
ll query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;
int mid=tr[u].l+tr[u].r>>1;
ll res=INF;
pushdown(u);
if(l<=mid)res=min(res,query(u<<1,l,r));
if(r>mid)res=min(res,query((u<<1)+1,l,r));
pushup(u);
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
scanf("%d",&m);
while(m--){
int l,r,d;
char c;
scanf("%d %d%c",&l,&r,&c);
l++,r++;
if(c!='\n'){
scanf("%d",&d);
if(l>r){
modify(1,l,n,d),modify(1,1,r,d);
}
else modify(1,l,r,d);
}
else{
ll t;
if(l>r){
t=min(query(1,l,n),query(1,1,r));
}
else t=query(1,l,r);
printf("%lld\n",t);
}
}
return 0;
}