제출 #288193

#제출 시각아이디문제언어결과실행 시간메모리
288193NemanjaSo2005Foehn Phenomena (JOI17_foehn_phenomena)C++14
0 / 100
1020 ms9468 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll koliko[200005],povecaj,res=0,T,S,N,Q,u1,u2,r1,r2,r3,r4,segmentno[400010];
ll nadji(int gde){
    ll ret=0;
    while(gde){
        ret+=segmentno[gde];
        gde/=2;
    }
    return ret;
}
void dodaj(int gde,int lb,int db,int l,int r){
    if(lb>db or l>r)
        return;
    if(lb==l and db==r){
        segmentno[gde]+=povecaj;
        return;
    }
    int mid=(l+r)/2;
    dodaj(gde*2,lb,mid,l,min(mid,r));
    dodaj(gde*2+1,mid+1,db,max(l,mid+1),r);
    return;
}
int main(){
    cin>>N>>Q>>S>>T;
    N++;
    for(int i=1;i<=N;i++)
        cin>>koliko[i];
    for(int i=1;i<N;i++)
        if(koliko[i]<koliko[i+1])
            res-=S*abs(koliko[i]-koliko[i+1]);
        else res+=T*abs(koliko[i]-koliko[i+1]);
   // cout<<res<<endl;
    while(Q--){
        cin>>u1>>u2>>povecaj;
        u1++;
        u2++;
        r1=nadji(u1-1+N);
        r2=nadji(u1+N);
        r3=nadji(u2+N);
        r4=nadji(u2+1+N);
        if(u1!=1){
            if(r1<r2)
                res+=(r2-r1)*S;
            else res-=(r1-r2)*T;
        }
        if(u2!=N){
            if(r3<r4)
                res+=(r4-r3)*S;
            else res-=(r3-r4)*T;
        }
       // cout<<res<<endl;
        dodaj(1,u1,u2,1,N);
        r2+=povecaj;
        r3+=povecaj;
        if(u1!=1){
            if(r1<r2)
                res-=(r2-r1)*S;
            else res+=(r1-r2)*T;
        }
        if(u2!=N){
            if(r3<r4)
                res-=(r4-r3)*S;
            else res+=(r3-r4)*T;
        }
      /*  for(int i=1;i<=N;i++)
            cout<<koliko[i]<<" ";
        cout<<endl;*/
        cout<<res<<endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...