제출 #819476

#제출 시각아이디문제언어결과실행 시간메모리
819476AlphaMale06Foehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
333 ms15660 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long
const int N = 200010;
int lazy[4*N];

void Update(int node, int l, int r, int L, int R, int val){
    if(L>r || R<l || l>r)return;
    if(L<=l && R>=r){
        lazy[node]+=val;
        return;
    }
    int mid=(l+r)/2;
    Update(2*node+1, l, mid, L, R, val);
    Update(2*node+2, mid+1, r, L, R, val);
}


int Get(int node, int l, int r, int ind){
    if(l>r || l>ind || r<ind)return 0;
    if(l==r)return lazy[node];
    int mid=(l+r)/2;
    int ret = Get(2*node+1, l, mid, ind)+Get(2*node+2, mid+1, r, ind) + lazy[node];
    return ret;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, q, dec, inc;
    cin >> n >> q >> dec >> inc;
    int a[n+1];
    for(int i=0; i< n+1; i++){
        cin >> a[i];
    }
    int temp=0;
    for(int i=1; i<=n; i++){
        if(a[i]-a[i-1]>0){
            temp-=dec*(a[i]-a[i-1]);
        }
        else temp+=inc*(a[i-1]-a[i]);
    }
    while(q--){
        int l, r, x;
        cin >> l >> r >> x;
        int pl, pll, pr, prr;
        int nl, nr;
        pl=Get(0, 1, n+1, l)+a[l];
        if(l==1)pll=0;
        else pll=Get(0, 1, n+1, l-1)+a[l-1];
        pr=Get(0, 1, n+1, r)+a[r];
        if(r==n)prr=pr;
        else prr=Get(0, 1, n+1, r+1)+a[r+1];
        nl=pl+x;
        nr=pr+x;
        if(pl<pll){
            temp-=inc*(pll-pl);
        }
        else temp+=dec*(pl-pll);
        if(pr<prr){
            if(r!=n)temp+=dec*(prr-pr);
        }
        else{
            if(r!=n)temp-=inc*(pr-prr);
        }
        if(nl<pll){
            temp+=inc*(pll-nl);
        }
        else temp-=dec*(nl-pll);
        if(nr>prr){
            if(r!=n)temp+=inc*(nr-prr);
        }
        else {
            if(r!=n)temp-=dec*(prr-nr);
        }
        Update(0, 1, n+1, l, r, x);
        cout << temp << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...