Submission #332058

#TimeUsernameProblemLanguageResultExecution timeMemory
332058maozkurtFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
141 ms10732 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <numeric>
#include <cassert>

#define endl '\n'
#define sp ' '

#define pb push_back
#define mp make_pair
#define ff first
#define ss second

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define int ll

const int maxn = 200005;
int arr[maxn];
int pre[maxn];
int eksi[maxn];

int32_t main(){

    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cerr.tie(nullptr);
    int n,q,s,t;cin>>n>>q>>s>>t;
    for(int i=0;i<=n;i++)
        cin>>arr[i];
    ll ans = 0;
    for(int i=1;i<=n;i++){
        pre[i] = arr[i]-arr[i-1];
        if(pre[i]<0){
            eksi[i] = -1;
            ans += t*abs(pre[i]);
        }
        else if(pre[i]>0){
            eksi[i] = 1;
            ans -= s*(pre[i]);
        }
    }
    while(q--){
        int l,r,ek;cin>>l>>r>>ek;

        if(ek>0){
            if(pre[l] >= 0){
                ans -= ek*s;
            }else{
                ans -= min(ek,abs(pre[l]))*t + max(0LL,pre[l] + ek)*s;
            }
        }
        else if(ek<0){
            if(pre[l] <= 0){
                ans += t*(abs(ek)); 
            }
            else{
                ans += min(abs(ek),pre[l])*s + max(0LL,abs(ek)-pre[l])*t;
            }
        }

        ek = -ek;
        if(r+1<=n){
            if(ek>0){
                if(pre[r+1] >= 0){
                    ans -= ek*s;
                }else{
                    ans -= min(ek,abs(pre[r+1]))*t + max(0LL,pre[r+1] + ek)*s;
                }
            }
            else if(ek<0){
                if(pre[r+1] <= 0){
                    ans += t*(abs(ek)); 
                }
                else{
                    ans += min(abs(ek),pre[r+1])*s + max(0LL,abs(ek)-pre[r+1])*t;
                }
            }
        }
        ek = -ek;
        pre[l] += ek;
        pre[r+1] -= ek;






        /*
           if(ek>0){
           if(pre[l]>=0){
           ans += ek*t;
           }
           else{
           ans += min(abs(pre[l]),ek)*s + max(0,ek-abs(pre[l])) * t;
           }
           }else if(ek < 0){
           if(pre[l]<=0){
           ans += ek * s; // ek < 0
           }
           else{
           ans -= min(pre[l],abs(ek))*t + max(0,abs(ek) - pre[l]) * s;
           }
           }
           if(r+1<=n){
           if(ek>0){
           if(pre[r+1] <= 0){
           ans -= ek*s;
           }
           else{
           ans -= min(pre[r+1],ek)*t + max(0,ek-abs(pre[r+1]))*s;
           }
           }
           else if(ek < 0){
           if(pre[r+1] >= 0){
           ans += ek*s;
           }
           else{
           ans 
           }
           }
           }


           pre[l] += ek;
           pre[r+1] -= ek;
           */
        /*
           pre[l] += ek;
           pre[r+1] -= ek;

           if(eksi[l] == -1 && pre[l]>=0){
           if(pre[l]==0) ans+=s;
           else ans += s + t;
           }
           else if(eksi[l] == 1 && pre[l] <= 0){
           if(pre[l]==0) ans -= t;
           else ans -= s + t;
           }
           else if(eksi[l] == 0 && pre[l] < 0){
           ans -= s;
           }
           else if(eksi[l] == 0 && pre[l] > 0){
           ans += t;
           }

           if(r+1<n){
           if(eksi[r+1] == -1 && pre[r+1]>=0){
           if(pre[r+1]==0) ans+=s;
           else ans += s + t;
           }
           else if(eksi[r+1] == 1 && pre[r+1] <= 0){
           if(pre[r+1]==0) ans -= t;
           else ans -= s + t;
           }
           else if(eksi[r+1] == 0 && pre[r+1] < 0){
           ans -= s;
           }
           else if(eksi[r+1] == 0 && pre[r+1] > 0){
           ans += t;
           }
           }

           eksi[l] = (pre[l]==0 ? 0 : (pre[l] < 0 ? -1 : 1));
           eksi[r+1] = (pre[r+1]==0 ? 0 : (pre[r+1] < 0 ? -1 : 1));
           */
        cout << ans << endl;
    }

}











#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...