제출 #1109551

#제출 시각아이디문제언어결과실행 시간메모리
1109551Zero_OPFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
129 ms13896 KiB
#include <bits/stdc++.h>

using namespace std;

struct Fenwick{
    vector<long long> bit;
    Fenwick(int n) : bit(n + 1, 0) {}

    void update(int id, long long val){
        for(; id < (int)bit.size(); id += id & (-id)){
            bit[id] += val;
        }
    }

    void updateRange(int l, int r, long long delta){
        update(l, delta);
        update(r + 1, -delta);
    }

    long long query(int id){
        long long sum = 0;
        for(; id > 0; id -= id & (-id)){
            sum += bit[id];
        }
        return sum;
    }
};

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

    int N, Q, S, T;

    cin >> N >> Q >> S >> T;
    vector<int> a(N + 1);
    for(int i = 0; i <= N; ++i){
        cin >> a[i];
    }

    long long cur = 0;
    vector<long long> diff(N + 1);
    for(int i = 1; i <= N; ++i){
        diff[i] = abs(a[i] - a[i - 1]);
        cur += (a[i - 1] < a[i] ? -S : +T) * diff[i];
    }

    Fenwick ft(N + 1);

    auto cost = [&](int i){
        long long pre = a[i - 1] + ft.query(i - 1), cur = a[i] + ft.query(i);
        long long delta = abs(cur - pre);
        if(pre < cur) delta *= -S;
        else delta *= T;
        return delta;
    };

    while(Q--){
        int l, r; long long x;
        cin >> l >> r >> x;

        cur -= cost(l);
        if(r < N) cur -= cost(r + 1);

        ft.updateRange(l, r, x);

        cur += cost(l);
        if(r < N) cur += cost(r + 1);

        cout << cur << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...