제출 #1333345

#제출 시각아이디문제언어결과실행 시간메모리
1333345piolkFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
132 ms9876 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn=2e5 + 5;

class segtree{
private:
    vector<long long> tree;
    int len=1;

    void radd(int v,int cs,int ce,int ls,int le,int x){
        if (cs>=ls && ce<=le){
            tree[v]+=x;
            return;
        }

        if (cs>le || ce<ls) return;

        int mid=(cs+ce)/2;
        radd(2*v,cs,mid,ls,le,x);
        radd(2*v+1,mid+1,ce,ls,le,x);
    }
    long long pget(int pos){
        pos+=len;
        long long ans=tree[pos];

        while (pos>1){
            pos/=2;
            ans+=tree[pos];
        }
        return ans;
    }
public:
    segtree(int n, vector<long long> &arr){
        while (len<n) len<<=1;
        tree.resize(2*len);

        for (int i=0;i<n;i++){
            tree[i+len]=arr[i];
        }
    }

    void add(int l,int r,int x){radd(1,0,len-1,l,r,x);}
    long long get(int pos){return pget(pos);}
};

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,q,s,t;
    cin>>n>>q>>s>>t;
    n++;

    vector<long long> l(n);
    for (int i=0;i<n;i++) cin>>l[i];

    segtree tree(n,l);

    long long ans=0;
    for (int i=1;i<n;i++){
        long long diff=l[i-1]-l[i];
        if (diff>0){
            ans+=diff*t;
        } else {
            ans+=diff*s;
        }
    }

    while (q--){
        int l,r,x;
        cin>>l>>r>>x;

        long long diff1=tree.get(l-1)-tree.get(l);
        if (diff1>0) ans-=diff1*t;
        else ans-=diff1*s;

        if (r<n-1){
            long long diff2=tree.get(r)-tree.get(r+1);
            if (diff2>0) ans-=diff2*t;
            else ans-=diff2*s;
        }

        tree.add(l,r,x);

        long long diff3=tree.get(l-1)-tree.get(l);
        if (diff3>0) ans+=diff3*t;
        else ans+=diff3*s;

        if (r<n-1){
            long long diff4=tree.get(r)-tree.get(r+1);
            if (diff4>0) ans+=diff4*t;
            else ans+=diff4*s;
        }

        cout<<ans<<"\n";
    }

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