题外话:MD暴力比线段树分还高
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
typedef long long ll;
int n,m,sp;
ll a[N*2];
struct ST{
int l,r;
int num;
int la;
}t[N*4];
ll getnum(){
int res = 0, f = 1;
char c = getchar();
while (!isdigit(c)){
if (c == '-')
f=-1;
c=getchar();
}
while (isdigit(c)){
res=res*10+c-48;
c=getchar();
}
if (c==' ')
++sp;
return res * f;
}
void build(int node,int l,int r){
t[node].l=l;
t[node].r=r;
if(l==r){
t[node].num=a[l];
return ;
}
int mid=(l+r)/2;
build(node*2,l,mid);
build(node*2+1,mid+1,r);
t[node].num=t[node*2].num+t[node*2+1].num;
}
void pd(int node){
if(t[node].la!=0){
t[node*2].la+=t[node].la;
t[node*2+1].la+=t[node].la;
t[node*2].num+=t[node].la;
t[node*2+1].num+=t[node].la;
t[node].la=0;
}
}
void add(int l,int r,int k,int node){
if(t[node].l>=l&&t[node].r<=r){
t[node].num+=k;
t[node].la+=k;
return ;
}
pd(node);
if(t[node*2].r>=l){
add(l,r,k,node*2);
}
if(t[node*2+1].l<=r){
add(l,r,k,node*2+1);
}
t[node].num=min(t[node*2].num,t[node*2+1].num);
}
void cop(int l,int r,int k){
if(r<=n){
add(l+n,r+n,k,1);
}else if(l>n){
add(l-n,r-n,k,1);
}else{
add(n+l,n+n,k,1);
add(1,r-n,k,1);
}
}
ll query(int node,int l,int r){
if(t[node].l>r||t[node].r<l){
return LONG_LONG_MAX;
}
if(t[node].l>=l&&t[node].r<=r){
return t[node].num;
}
return min(query(node*2,l,r),query(node*2+1,l,r));
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
//for(int i=1;i<=n*2;i++){
// cout<<a[i]<<' ';
//}
// cout<<"\n";
cin>>m;
build(1,1,n*2);
while(m--){
ll l=getnum(),r=getnum(),v;
l++;
r++;
//cout<<l<<' '<<r<<"\n";
if(sp==2){
cin>>v;
if(r<l){
r+=n;
}
add(l,r,v,1);
cop(l,r,v);
//for(int i=l;i<=r;i++){
// a[i]+=v;
// if(i<=n){
// a[i+n]+=v;
// }else{
// a[i-n]+=v;
// }
//}
}else{
if(r<l){
r+=n;
}
cout<<query(1,l,r)<<"\n";
}
sp=0;
//for(int i=1;i<=n*2;i++){
// cout<<a[i]<<' ';
//}
//cout<<"\n";
}
return 0;
}