只AC #1 # 3 #4
求助
#include<bits/stdc++.h>
#define ll long long
#define inf LONG_LONG_MAX
using namespace std;
const int N=2e5+114514;
struct ST
{
int l,r;
ll minn,sum,tag;
}tree[N<<2];
int a[N];
void pushup(int x)
{
tree[x].minn=min(tree[x<<1].minn,tree[x<<1|1].minn);
tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
return;
}
void build(int x,int l,int r)
{
tree[x]={l,r,inf,0,0};
if(l==r)
{
tree[x]={l,r,a[l],a[l],0};
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
return;
}
void pushdown(int x)
{
ST &rt=tree[x],&ls=tree[x<<1],&rs=tree[x<<1|1];
if(rt.tag)
{
ls.tag+=rt.tag;
rs.tag+=rt.tag;
ls.minn+=rt.tag;
rs.minn+=rt.tag;
ls.sum+=(ls.r-ls.l+1)*rt.tag;
rs.sum+=(rs.r-rs.l+1)*rt.tag;
rt.tag=0;
}
return;
}
void update(int x,int l,int r,int k)
{
if(l<=tree[x].l&&r>=tree[x].r)
{
tree[x].minn+=k;
tree[x].tag+=k;
tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
return;
}
pushdown(x);
int mid=tree[x].l+tree[x].r>>1;
if(l<=mid)
update(x<<1,l,r,k);
if(r>mid)
update(x<<1|1,l,r,k);
pushup(x);
return;
}
ll query1(int x,int l,int r)
{
if(l<=tree[x].l&&r>=tree[x].r)
return tree[x].minn;
pushdown(x);
int mid=tree[x].l+tree[x].r>>1;
ll ans=inf;
if(l<=mid)
ans=min(ans,query1(x<<1,l,r));
if(r>mid)
ans=min(ans,query1(x<<1|1,l,r));
return ans;
}
ll query2(int x,int l,int r)
{
if(l<=tree[x].l&&r>=tree[x].r)
return tree[x].sum;
pushdown(x);
int mid=tree[x].l+tree[x].r>>1;
ll ans=0;
if(l<=mid)
ans+=query2(x<<1,l,r);
if(r>mid)
ans+=query2(x<<1|1,l,r);
return ans;
}
void print(int p)
{
printf("The list is : \n");
for(int i=1;i<=p;i++)
{
printf("%lld ",query2(1,i,i));
}
putchar('\n');
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while(q--)
{
char op;
int l,r,k;
cin>>op>>l>>r;
if(op=='M') //min
cout<<query1(1,l,r)<<"\n";
if(op=='P') //add
{
cin>>k;
update(1,l,r,k);
}
if(op=='S') //sum
cout<<query2(1,l,r)<<"\n";
// print(n);
}
return 0;
}