线段树 10pts on #1 求条
查看原帖
线段树 10pts on #1 求条
951050
lostxxx楼主2024/8/17 11:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q;
struct node{
    ll l,r;
    ll minx,sum;
    ll lazy;
}tr[1000100];
ll l,r,d;
ll a[300100];
char opt;
void pushup(ll x){
    tr[x].minx=min(tr[x<<1].minx,tr[x<<1|1].minx);
    tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;
}
void pushdown(ll x){
    ll mid=tr[x].l+tr[x].r>>1;
    if (tr[x].lazy!=0){
        tr[x<<1].lazy+=tr[x].lazy;
        tr[x<<1|1].lazy+=tr[x].lazy;
        tr[x<<1].minx+=tr[x].lazy;
        tr[x<<1|1].minx+=tr[x].lazy;
        tr[x<<1].sum+=(tr[x].lazy*(mid-tr[x].l+1));
        tr[x<<1|1].sum+=(tr[x].lazy*(tr[x].r-mid));
        tr[x].lazy=0;
    }
}
void build(ll x,ll l,ll r){
    tr[x].l=l;
    tr[x].r=r;
    if (l==r){
        tr[x].minx=a[l];
        tr[x].sum=a[l];
        return;
    }
    ll mid=l+r>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
void change(ll x,ll l,ll r,ll d){
    if (l<=tr[x].l && tr[x].r<=r){
        tr[x].minx+=d;
        tr[x].sum+=(d*tr[x].r-tr[x].l+1);
        tr[x].lazy+=d;
        return;
    }
    //pushdown(x);
    ll mid=tr[x].l+tr[x].r>>1;
    if (l<=mid)
        change(x<<1,l,r,d);
    if (mid+1<=r)
        change(x<<1|1,l,r,d);
    pushup(x);
}
ll ask1(ll x,ll l,ll r){
    if (l<=tr[x].l && tr[x].r<=r){
        return tr[x].minx;
    }
    pushdown(x);
    ll res=9e18;
    ll mid=tr[x].l+tr[x].r>>1;
    if (l<=mid)
        res=min(res,ask1(x<<1,l,r));
    if (mid+1<=r)
        res=min(res,ask1(x<<1|1,l,r));
    return res;
}
ll ask2(ll x,ll l,ll r){
    if (l<=tr[x].l && tr[x].r<=r){
        return tr[x].sum;
    }
    pushdown(x);
    ll res=0;
    ll mid=tr[x].l+tr[x].r>>1;
    if (l<=mid) 
        res+=ask2(x<<1,l,r);
    if (mid+1<=r)
        res+=ask2(x<<1|1,l,r);
    return res;
}
int main(){
    cin>>n>>q;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    build(1,1,n);
    while(q--){
        cin>>opt;
        if (opt=='P'){
            cin>>l>>r>>d;
            //return 0;
            change(1,l,r,d);
        }else if (opt=='M'){
            cin>>l>>r;
            cout<<ask1(1,l,r)<<endl;
        }else if (opt=='S'){
            cin>>l>>r;
            cout<<ask2(1,l,r)<<endl;
        }
    }
}
2024/8/17 11:02
加载中...