Submission #516693

#TimeUsernameProblemLanguageResultExecution timeMemory
516693GiantpizzaheadFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
184 ms12408 KiB
/*
Solution: Each query only updates the temperature change at 2 locations - on the left, and on the right.
So, use a BIT to handle range updates and point queries / update the temperature for each query.
Runtime: O((N+Q) * log(N)) with notable constant factor
*/

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define sz(x) ((int) x.size())
#define all(x) x.begin(), x.end()
#define debug if (true) cerr
using ll = long long;

const int MAXN = 2e5+5;

int N, Q;
int A[MAXN];
ll S, T;
ll currTemp;

struct BIT {
    ll V[MAXN];

    void upd(int i, ll v) {
        for (; i <= N; i+=i&-i) {
            V[i] += v;
        }
    }

    ll getTemp(int i) {
        if (i == 0 || i == N) return 0;
        ll a = query(i), b = query(i+1);
        if (a < b) return -S * (b-a);
        else return T * (a-b);
    }

    void upd(int l, int r, ll v) {
        currTemp -= getTemp(l-1);
        currTemp -= getTemp(r);
        upd(l, v);
        upd(r+1, -v);
        currTemp += getTemp(l-1);
        currTemp += getTemp(r);
    }

    ll query(int i) {
        ll r = 0;
        for (; i > 0; i-=i&-i) {
            r += V[i];
        }
        return r;
    }
} bit;

void solve() {
    cin >> N >> Q >> S >> T;
    N++;
    currTemp = 0;
    rep(i, 1, N+1) {
        cin >> A[i];
        bit.upd(i, i, A[i]);
    }
    rep(i, 0, Q) {
        int l, r;
        ll x;
        cin >> l >> r >> x;
        l++, r++;
        bit.upd(l, r, x);
        cout << currTemp << '\n';
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...