제출 #289650

#제출 시각아이디문제언어결과실행 시간메모리
289650rocks03Foehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
629 ms13364 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pld pair<long double, int> #define pii pair<int, int> #define pll pair<ll, ll> #define pb push_back #define ff first #define ss second #define SZ(x) ((int)(x).size()) #define ld long double mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MAXN = 2e5+100; int N, Q; ll S, T, a[MAXN]; void read(){ cin >> N >> Q >> S >> T; for(int i = 0; i <= N; i++){ cin >> a[i]; } } ll b[MAXN]; void add(int i, int k){ for(; i < MAXN; i += (i & -i)) b[i] += k; } ll get(int i){ ll s = 0; for(; i > 0; i -= (i & -i)) s += b[i]; return s; } pll compare(int i){ pll diff = {0, 0}; ll ob1 = get(i), ob2 = get(i-1); if(i - 1 >= 0 && ob1 > ob2){ diff.ss += ob1 - ob2; } else if(i - 1 >= 0 && ob2 > ob1){ diff.ff += ob2 - ob1; } return diff; } ll ans; pll cur; void preprocess(){ for(int i = 1; i <= N; i++){ add(i, a[i]); add(i+1, -a[i]); } for(int i = 1; i <= N; i++){ pll diff = compare(i); cur.ff += diff.ff, cur.ss += diff.ss; } ans = cur.ff * T - cur.ss * S; } void update(int l, int r, int x){ pll diff; diff = compare(l); cur.ff -= diff.ff, cur.ss -= diff.ss; if(r+1 <= N){ diff = compare(r+1); cur.ff -= diff.ff, cur.ss -= diff.ss; } add(l, x); add(r+1, -x); diff = compare(l); cur.ff += diff.ff, cur.ss += diff.ss; if(r+1 <= N){ diff = compare(r+1); cur.ff += diff.ff, cur.ss += diff.ss; } ans = cur.ff * T - cur.ss * S; } void solve(){ read(); preprocess(); while(Q--){ int l, r, x; cin >> l >> r >> x; update(l, r, x); cout << ans << "\n"; } } int main(){ ios_base::sync_with_stdio(false); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...