L3-017 森森快递 (30 分)

https://www.cnblogs.com/8023spz/p/10448361.html


#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
const int maxn = 2e5+10;
typedef long long LL;
LL a[maxn];
LL tree[4*maxn];
LL add[4*maxn];
void build(int o,int l,int r){
    if(l == r){
        tree[o] = a[l];
        return ;
    }
    int mid = (l+r)/2;
    build(lson,l,mid);
    build(rson,mid+1,r);
    tree[o] = min(tree[lson],tree[rson]);
}
void Update(int o,int l,int r,int L,int R,int v){
    if(L <= l && r <= R){
        add[o] += v;
        return ;
    }
    int m = (l+r)/2;
    if(L <= m)
        Update(lson,l,m,L,R,v);
    if(R > m)
        Update(rson,m+1,r,L,R,v);
    tree[o] = min(tree[lson]+add[lson],tree[rson]+add[rson]);
}

LL  Query(int o,int l,int r,int L,int R){
    if(L <= l && r <= R){
        return tree[o]+add[o];
    }
    if(add[o]){
        add[lson] += add[o];
        add[rson] += add[o];
        tree[o]  += add[o];
        add[o] = 0;
    }
    int m = (l+r)/2;
    LL Min = 1e18;
    if(L <= m)
        Min = min(Min,Query(lson,l,m,L,R));
    if(R > m)
        Min = min(Min,Query(rson,m+1,r,L,R));
    return Min;
}