代码如下
#include<bits/stdc++.h>
using namespace std;
const int maxn=400000;
int n,m,a[maxn];
#define int long long
struct SegmentTree
{
int l,r;
int add;//lazy tag of add
int dat_sum;//sum
int dat_min;//min
}seg[maxn<<2];
void update(int p)
{
seg[p].dat_sum=seg[p<<1].dat_sum+seg[p<<1|1].dat_sum;
seg[p].dat_min=min(seg[p<<1].dat_min,seg[p<<1|1].dat_min);
}
void build(int l,int r,int p)
{
seg[p].l=l,seg[p].r=r;
if (l==r)
{
seg[p].dat_sum=seg[p].dat_min=a[l];
return ;
}
int mid = (l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
update(p);
}
int len(int p)
{
return seg[p].r-seg[p].l+1;
}
void spread(int p)
{
if (!seg[p].add) return ;
seg[p<<1].add+=seg[p].add;
seg[p<<1|1].add+=seg[p].add;
seg[p<<1].dat_min+=seg[p].add;
seg[p<<1|1].dat_min+=seg[p].add;
seg[p<<1].dat_sum=len(p<<1)*seg[p].add;
seg[p<<1|1].dat_sum=len(p<<1|1)*seg[p].add;
seg[p].add=0;
}
void change(int ql,int qr,int k,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
seg[p].add+=k;
seg[p].dat_min+=k;
seg[p].dat_sum+=k*len(p);
return ;
}
spread(p);
int mid=(seg[p].l+seg[p].r)>>1;
if (ql<=mid) change(ql,qr,k,p<<1);
if (qr>mid) change(ql,qr,k,p<<1|1);
update(p);
}
int ask_sum(int ql,int qr,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
return seg[p].dat_sum;
}
spread(p);
int mid = (seg[p].l+seg[p].r) >> 1;
int ans=0;
if (ql<=mid) ans+=ask_sum(ql,qr,p<<1);
if (qr>mid) ans+=ask_sum(ql,qr,p<<1|1);
return ans;
}
int ask_min(int ql,int qr,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
return seg[p].dat_min;
}
spread(p);
int mid = (seg[p].l+seg[p].r) >> 1;
int ans=0x7f7f7f7f;
if (ql<=mid) ans=ask_min(ql,qr,p<<1);
if (qr>mid) ans=min(ans,ask_min(ql,qr,p<<1|1));
return ans;
}
signed main()
{
scanf("%lld %lld",&n,&m);
for (int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
}
build(1,n,1);
char op;
for (int i=1;i<=m;i++)
{
cin>>op;
if (op=='M')
{
int l,r;
scanf("%lld",&l,&r);
printf("%lld\n",ask_min(l,r,1));
}
if (op=='S')
{
int l,r;
scanf("%lld %lld",&l,&r);
printf("%lld\n",ask_sum(l,r,1));
}
if (op=='P')
{
int l,r,z;
scanf("%lld %lld %lld",&l,&r,&z);
change(l,r,z,1);
}
}
return 0;
}
关注能调出的大佬