Submission #1347667

#TimeUsernameProblemLanguageResultExecution timeMemory
1347667JuanJLFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
250 ms10488 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset(a,v,sizeof(a))
#define forn(i,a,b) for(int i = a; i<b; i++)

using namespace std;
typedef long long ll;

struct Fenwick{
    ll n; 
    vector<ll> st;
    Fenwick(ll n):n(n),st(2*n+5,0){}
    void upd(ll p, ll v){
        while(p<=n){
            st[p]+=v;
            p+=(p&-p);
        }
    }
    ll query(ll p){
        ll res = 0;
        while(p>=1){
            res+=st[p];
            p-=(p&-p);
        }
        return res;
    }
};


int main(){
    ll n,q,s,t; cin>>n>>q>>s>>t;
    vector<ll> a(n+1); forn(i,0,n+1) cin>>a[i];

    
    ll res = 0;
    vector<ll> dif=a;
    forn(i,1,n+1){
        dif[i]=a[i]-a[i-1];
        if(dif[i]<=0) res+=abs(dif[i])*t;
        else res-=abs(dif[i])*s;
    }

    Fenwick fen(n+2);
    forn(i,1,n+1) fen.upd(i,dif[i]);
    
    forn(i,0,q){
        ll l,r,k; cin>>l>>r>>k;
        
        
        ll ldif = fen.query(l)-(l-1>=1?fen.query(l-1):0);
        if(ldif<=0) res-=abs(ldif)*t;
        else res+=abs(ldif)*s;

        
        fen.upd(l,k); 
        ldif = fen.query(l)-(l-1>=1?fen.query(l-1):0);
        if(ldif<=0) res+=abs(ldif)*t;
        else res-=abs(ldif)*s;
        

        if(r+1<=n){
            ll rdif = fen.query(r+1)-fen.query(r);
            if(rdif<=0) res-=abs(rdif)*t;
            else res+=abs(rdif)*s;
            
            fen.upd(r+1,-k);
            rdif = fen.query(r+1)-fen.query(r);
            if(rdif<=0) res+=abs(rdif)*t;
            else res-=abs(rdif)*s;
        }
        cout<<res<<'\n';
    }

    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...