Submission #1016370

#TimeUsernameProblemLanguageResultExecution timeMemory
1016370IcelastFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
633 ms19928 KiB
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
struct SegmentTree{
    int n, N;
    vector<ll> T, lz;
    SegmentTree(int n) : n(n){
        N = 1;
        while(N < n) N*=2;
        T.resize(N*2+1, 0);
        lz.resize(N*2+1, 0);
    };
    void down(int node){
        for(int child = node*2; child <= node*2+1; child++){
            if(child >= 2*N) continue;
            lz[child] += lz[node];
        }
        T[node] += lz[node];
        lz[node] = 0;
    }
    void upd(int l, int r, ll x){
        auto upd = [&](auto upd, int node, int low, int high, int l, int r, ll x) -> void{
            down(node);
            if(low > r || l > high) return;
            if(low >= l && r >= high){
                lz[node] += x;
                down(node);
                return;
            }
            int mid = (low+high)/2;
            upd(upd, node*2, low, mid, l, r, x);
            upd(upd, node*2+1, mid+1, high, l, r, x);
        };
        upd(upd, 1, 1, N, l, r, x);
    };
};
void solve(){
    ll n, q, s, t;
    cin >> n >> q >> s >> t;
    vector<ll> a(n+1);
    for(int i = 0; i <= n; i++){
        cin >> a[i];
    }
    SegmentTree T(n+1);
    for(int i = 1; i <= n; i++){
        T.upd(i, i, a[i]);
    }
    ll cur = 0;
    for(int i = 1; i <= n; i++){
        if(a[i] > a[i-1]){
            cur += -s*(a[i]-a[i-1]);
        }else{
            cur += t*(a[i-1]-a[i]);
        }
    }
    for(int i = 1; i <= q; i++){
        ll l, r, x;
        cin >> l >> r >> x;
        //get the correct value
        T.upd(l-1, l-1, 0);
        T.upd(l, l, 0);
        T.upd(r+1, r+1, 0);
        T.upd(r, r, 0);
        int N = T.N;
        ll l1, l2 = T.T[l+N-1], r1 = T.T[r+N-1], r2;
        if(l == 1){
            l1 = 0;
        }else{
            l1 = T.T[l-1+N-1];
        }
        if(r == n){
            r2 = r1;
        }else{
            r2 = T.T[r+1+N-1];
        }
        ll d1 = 0, d2 = 0;
        if(l2 > l1){
            d1 += (l2-l1)*-s;
        }else{
            d1 += (l1-l2)*t;
        }
        if(r2 > r1){
            d1 += (r2-r1)*-s;
        }else{
            d1 += (r1-r2)*t;
        }
        T.upd(l, r, x);
        T.upd(l-1, l-1, 0);
        T.upd(l, l, 0);
        T.upd(r+1, r+1, 0);
        T.upd(r, r, 0);
        l2 = T.T[l+N-1], r1 = T.T[r+N-1];
        if(l == 1){
            l1 = 0;
        }else{
            l1 = T.T[l-1+N-1];
        }
        if(r == n){
            r2 = r1;
        }else{
            r2 = T.T[r+1+N-1];
        }
        if(l2 > l1){
            d2 += (l2-l1)*-s;
        }else{
            d2 += (l1-l2)*t;
        }
        if(r2 > r1){
            d2 += (r2-r1)*-s;
        }else{
            d2 += (r1-r2)*t;
        }
        cur += d2-d1;
        cout << cur << "\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...