提交记录:这里
代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<queue>
#include<deque>
#include<cstring>
#include<string>
#include<set>
#include<utility>
#include<set>
#include<map>
#include<climits>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
constexpr int N=2e5,M=2e5;
#define I using
#define AK namespace
#define IOI std
#define ls (rt<<1)
#define rs (rt<<1|1)
I AK IOI;
int n,m;
using ll=long long;
using cit=const int&;
using cll=const long long&;
struct g
{
int l,r;
ll ad,d,mn;
}a[N<<2];
ll b[N+5];
bool sp;
// #define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template<typename T> void inline read(T& x)
{
int8_t f=1;char ch;x=0;
ch=getchar();
while(ch<'0'||ch>'9') ch=='-'?f=-1:f,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();x*=f;
sp=ch==' '?1:0;//快读判空格
}
template<typename T,typename... Arg> void inline read(T& x,Arg& ... arg){read(x);read(arg...);}
void inline pu(cit rt)
{
a[rt].d=a[ls].d+a[rs].d;
a[rt].mn=min(a[ls].mn,a[rs].mn);
}//上传标记
void build(cit rt,cit l,cit r)
{
cit mid=l+r>>1;
a[rt].l=l;a[rt].r=r;a[rt].ad=0;
if(l==r)
{
a[rt].d=b[l];
a[rt].mn=b[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pu(rt);
}
void inline pp(cit rt)
{
if(a[rt].ad)
{
a[ls].d+=a[rt].ad*(a[ls].r-a[ls].l+1);
a[rs].d+=a[rt].ad*(a[rs].r-a[rs].l+1);
a[ls].ad+=a[rt].ad;a[rs].ad+=a[rt].ad;
a[ls].mn+=a[rt].ad;a[rs].mn+=a[rt].mn;
a[rt].ad=0;
}
}//下传标记
void ad(cit rt,cit l,cit r,cll k)
{
cit md=a[rt].l+a[rt].r>>1;
if(l<=a[rt].l&&a[rt].r<=r)
{
a[rt].ad+=k;
a[rt].d+=(a[rt].r-a[rt].l+1)*k;
a[rt].mn+=k;
return ;
}
pp(rt);
if(l<=md) ad(ls,l,r,k);
if(md<r) ad(rs,l,r,k);
pu(rt);
}//加
ll qy(cit rt,cit l,cit r)
{
cit md=a[rt].l+a[rt].r>>1;
ll ret=LONG_LONG_MAX;
if(l<=a[rt].l&&a[rt].r<=r)
{
return a[rt].mn;
}
pp(rt);
if(l<=md) ret=min(ret,qy(ls,l,r));
if(md<r) ret=min(ret,qy(rs,l,r));
pu(rt);
return ret;
}//求最小值
int main()
{
int n;
read(n);
for(int i=1;i<=n;i++) read(b[i]);
build(1,1,n);
read(m);
for(int i=1;i<=m;i++)
{
int l,r;
read(l);read(r);l++,r++;
if(sp)
{
ll k;
read(k);
if(r<l)
{
ad(1,l,n,k);
ad(1,1,r,k);
}
else ad(1,l,r,k);
}
else
{
ll ret=LONG_LONG_MAX;
if(r<l)
{
ret=min(ret,qy(1,l,n));
ret=min(ret,qy(1,1,r));
}
else ret=min(ret,qy(1,l,r));
printf("%lld\n",ret);
}
}
return 0;
}