Submission #1139622

#TimeUsernameProblemLanguageResultExecution timeMemory
1139622altern23Foehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
90 ms7240 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize ("O2")
#pragma GCC optimize ("unroll-loops")
 
#define ll long long
#define pii pair<ll,ll>
#define fi first
#define sec second
#define ld long double

ostream& operator << (ostream& os, pii x){
    os << "[";
    os << " " << x.fi << " " << x.sec;
    os << " ]";
 
    return os;
}

ostream& operator << (ostream& os, pair<pii, ll> x){
    os << "[";
    os << " " << x.fi << " " << x.sec;
    os << " ]";
 
    return os;
}

ostream& operator << (ostream& os, pair<ll, pii> x){
    os << "[";
    os << " " << x.fi << " " << x.sec;
    os << " ]";
 
    return os;
}

template <typename T>
ostream& operator << (ostream& os, vector<T>tmp){
    os << "[";
    for(auto x : tmp) os << " " << x;
    os << " ]";
 
    return os;
}

template <typename T>
ostream& operator << (ostream& os, set<T>tmp){
    os << "[";
    for(auto x : tmp) os << " " << x;
    os << " ]";
 
    return os;
}
 
template <typename T>
ostream& operator << (ostream& os, multiset<T>tmp){
    os << "[";
    for(auto x : tmp) os << " " << x;
    os << " ]";
 
    return os;
}

const ll MOD = 998244353;
const ll N = 5e3;
const ll INF = 2e18;

// modulo operations
void add(ll &a, ll b) { a = (a + b) % MOD; }
void sub(ll &a, ll b) { a -= b; while(a < 0) a += MOD; a %= MOD; }
void mul(ll &a, ll b) { a = (a * b) % MOD; }

ll expo(ll a, ll b) {
    ll ans = 1;
    while(b > 0){
        if(b & 1) mul(ans, a);
        mul(a, a);
        b /= 2;
    }

    return ans;
}

struct fenwick{
    ll n;
    vector<ll> bit;
    fenwick(ll size){
        n = size;
        bit.resize(n + 5);
    }
    void upd(ll idx, ll val){
        for(int i = idx; i <= n; i += i & -i) bit[i] += val;
    }
    ll get(ll idx){
        ll ans = 0;
        for(int i = idx; i >= 1; i -= i & -i) ans += bit[i];
        return ans;
    }
    ll query(ll l, ll r){
        return get(r) - get(l - 1);
    }
};

int32_t main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tc = 1;
    // cin >> tc;
    for(;tc--;){
        ll n, q, s, t; cin >> n >> q >> s >> t;
        
        fenwick bit(n + 5);
        vector<ll> a(n + 5);

        for(int i = 0; i <= n; i++){
            cin >> a[i];
            if(i != 0){
                bit.upd(i, a[i]);
                bit.upd(i + 1, -a[i]);
            }
        }

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

        auto del = [&](ll idx){
            if(idx > n || idx < 1) return;
            ll A = bit.query(1, idx), B = (idx - 1 == 0 ? 0 : bit.query(1, idx - 1));
            if(A <= B) ans -= (B - A) * t;
            else ans += (A - B) * s;
        };

        auto ins = [&](ll idx){
            if(idx > n || idx < 1) return;
            ll A = bit.query(1, idx), B = (idx - 1 == 0 ? 0 : bit.query(1, idx - 1));
            if(A <= B) ans += (B - A) * t;
            else ans -= (A - B) * s;
        };

        for(int i = 1; i <= q; i++){
            ll l, r, x; cin >> l >> r >> x;
            del(l), del(r + 1);
            bit.upd(l, x);
            bit.upd(r + 1, -x);
            ins(l), ins(r + 1);
                
            cout << ans << "\n";
        }
    }   
}

/*

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