Submission #1298313

#TimeUsernameProblemLanguageResultExecution timeMemory
1298313david_g611Foehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
363 ms7232 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int NMAX=2e5;
int n, q, s, t;
int v[NMAX+1];

struct AIB
{
    int aib[NMAX+5];
    AIB()
    {
        for(auto &x:aib)x=0;
    }

    void update(int poz, int val)
    {
        for(;poz<=NMAX; poz+=poz&(-poz))
            aib[poz]+=val;
    }
    int get(int poz)
    {
        int sum=0;
        for(; poz>0; poz-=poz&(-poz))
            sum+=aib[poz];
        return sum;
    }
}aib;

signed main()
{
    cin>>n>>q>>s>>t;
    for(int i=0; i<=n; i++)
        cin>>v[i];

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

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

        int before_l = v[l-1]+aib.get(l-1), now_l = v[l]+aib.get(l);
        if(now_l < before_l)ans-=t*(before_l-now_l);
        else ans-=s*(before_l-now_l);

        now_l+=x;

        if(now_l < before_l)ans+=t*(before_l-now_l);
        else ans+=s*(before_l-now_l);


        if(r!=n)
        {
            int after_r = v[r+1]+aib.get(r+1), now_r = v[r]+aib.get(r);
            if(after_r < now_r)ans-=t*(now_r-after_r);
            else ans-=s*(now_r-after_r);

            now_r+=x;

            if(after_r < now_r)ans+=t*(now_r-after_r);
            else ans+=s*(now_r-after_r);
        }

        aib.update(l, x);
        aib.update(r+1, -x);

        cout<<ans<<'\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...