제출 #532522

#제출 시각아이디문제언어결과실행 시간메모리
532522MarceantasyFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
373 ms35072 KiB
#include <bits/stdc++.h>
using namespace std; 

#define ll long long 
#define ar array

typedef pair<int, int> pi;

const int mxN = 2e5+5, M = 1e9+7;
ll n, q, s, t; 

struct SEG{
    ll ans[4*mxN], rval[4*mxN], lval[4*mxN], lazy[4*mxN];
    void init(){
        memset(ans, 0, sizeof(ans));
        memset(rval, 0, sizeof(rval)); 
        memset(lval, 0, sizeof(lval));
        memset(lazy, 0, sizeof(lazy));
    }
    void push(int i){
        rval[2*i] += lazy[i];
        lval[2*i] += lazy[i];
        lazy[2*i] += lazy[i];
        rval[2*i+1] += lazy[i];
        lval[2*i+1] += lazy[i];
        lazy[2*i+1] += lazy[i];
        lazy[i] = 0;
    }
    void merge(int i){
        rval[i] = rval[2*i+1];
        lval[i] = lval[2*i];    
        ans[i] = ans[2*i] + ans[2*i+1];
        if(rval[2*i] < lval[2*i+1]){
            ans[i] += s*(lval[2*i+1]-rval[2*i]);
        }else{
            ans[i] -= t*(rval[2*i]-lval[2*i+1]);
        }
    }
    void upd(int l1, int r1, int l2, int r2, int i, ll val){
        if(r1 < l2 || r2 < l1) return;
        if(l1 <= l2 && r2 <= r1){
            rval[i]+=val;
            lval[i]+=val;
            lazy[i]+=val;
            return;
        }
        int m2 = (l2+r2)/2;
        push(i);
        upd(l1, r1, l2, m2, 2*i, val);
        upd(l1, r1, m2+1, r2, 2*i+1, val);
        merge(i);
    }
    void print(int l1, int r1, int i){
        if(l1 == r1){
            cout << lval[i] << " ";
            return;
        }
        int m1 = (l1+r1)/2;
        print(l1, m1, 2*i);
        print(m1+1, r1, 2*i+1);
    }
}seg;

int main(){
#ifdef _DEBUG
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
#endif
    std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);

    cin >> n >> q >> s >> t;
    seg.init();
    //seg.print(0, n, 1);
    //cout << " here\n";
    for(int i = 0; i<=n; ++i){
        ll x; 
        cin >> x;
        seg.upd(i, i, 0, n, 1, x);
    }
    //seg.print(0, n, 1);
    //cout << "\n";
    while(q--){
        int a, b;
        ll c;  
        cin >> a >> b >> c; 
        seg.upd(a, b, 0, n, 1, c);
      //  seg.print(0, n, 1);
      //  cout << "\n";
        cout << -seg.ans[1] << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...