제출 #635888

#제출 시각아이디문제언어결과실행 시간메모리
635888ljubaFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
167 ms13140 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

class FenwickTree {
private:
    int n;
    vector<ll> ft;
public:
    FenwickTree(int _n) : n(_n) {
        ft.resize(n + 1);
    }

    void update(int i, ll x) {
        for(; i <= n; i += i & -i) {
            ft[i] += x;
        }
    }

    ll query(int i) {
        ll r = 0;

        for(; i; i -= i & -i) {
            r += ft[i];
        }

        return r;
    }
};

ll s, t;

inline ll dodaj(ll x, ll y) {
    ll raz = abs(x - y);

    if(x < y) return -raz * s;
    else return raz * t;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, q;

    cin >> n >> q >> s >> t;

    vector<ll> v(n + 1);

    for(int i = 0; i <= n; ++i) {
        cin >> v[i];
    }

    ll ans = 0;

    FenwickTree ft(n);

    for(int i = 1; i <= n; ++i) {
        ans += dodaj(v[i - 1], v[i]);

        ft.update(i, v[i]);

        if(i + 1 <= n) {
            ft.update(i + 1, -v[i]);
        }
    }

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

        cin >> l >> r >> x;

        ans -= dodaj(ft.query(l - 1), ft.query(l));

        if(r + 1 <= n) {
            ans -= dodaj(ft.query(r), ft.query(r + 1));
        }

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

        ans += dodaj(ft.query(l - 1), ft.query(l));

        if(r + 1 <= n) {
            ans += dodaj(ft.query(r), ft.query(r + 1));
        }

        cout << ans << '\n';

        // for(int i = 1; i <= n; ++i) {
        //     cerr << ft.query(i) << " ";
        // }

        // cerr << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...