제출 #1280791

#제출 시각아이디문제언어결과실행 시간메모리
1280791thirdFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
463 ms18156 KiB
//Huyduocdithitp #include<bits/stdc++.h> typedef long long ll; #define endl '\n' #define fi first #define se second #define pii pair<ll,ll> #define N 400005 #define LOG 18 using namespace std; const ll inf = 1e8, base = 311, mod = 1e9 + 7; bool ghuy4g; ll n, q, S, T, sum = 0, a[N], st[4 * N], f[4 * N]; void build(ll id, ll l, ll r) { if (l == r) { st[id] = a[l]; return; } ll mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); } void lazy(ll id) { if (f[id] == 0) return; st[id] += f[id]; f[id * 2] += f[id]; f[id * 2 + 1] += f[id]; f[id] = 0; } void update(ll id, ll l, ll r, ll L, ll R, ll v) { lazy(id); if (l > R || r < L) { return; } if (L <= l && r <= R) { f[id] += v; lazy(id); return; } ll mid = (l + r) / 2; update(id * 2, l, mid, L, R, v); update(id * 2 + 1, mid + 1, r, L, R, v); } ll get(ll id, ll l, ll r, ll i) { if (i < 0 || i > n) return 0; lazy(id); if (i > r || i < l) return 0; if (l == r) { return st[id]; } ll mid = (l + r) / 2; return get(id * 2, l, mid, i) + get(id * 2 + 1, mid + 1, r, i); } bool klinh; signed main() { //freopen("boardgame.inp", "r", stdin); //freopen("boardgame.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> q >> S >> T; for (int i = 0; i <= n; i ++) { cin >> a[i]; if (a[i - 1] < a[i]) { sum += S * (a[i] - a[i - 1]); } else if (a[i - 1] >= a[i]){ sum += T * (a[i] - a[i - 1]); // tang } } build(1, 1, n); for (int i = 1; i <= q; i ++) { ll l, r, x; cin >> l >> r >> x; if (1) { ll old_l = get(1, 1, n, l); ll prev = get(1, 1, n, l - 1); if (prev < old_l) { sum -= S * (old_l - prev); } else { sum -= T * (old_l - prev); } } if (r < n) { ll old_r = get(1, 1, n, r); ll sau = get(1, 1, n, r + 1); if (old_r < sau) { sum -= S * (sau - old_r); } else { sum -= T * (sau - old_r); } } update(1, 1, n, l, r, x); if (1) { ll old_l = get(1, 1, n, l); ll prev = get(1, 1, n, l - 1); if (prev < old_l) { sum += S * (old_l - prev); } else { sum += T * (old_l - prev); } } if (r < n) { ll old_r = get(1, 1, n, r); ll sau = get(1, 1, n, r + 1); if (old_r < sau) { sum += S * (sau - old_r); } else { sum += T * (sau - old_r); } } cout << -sum << endl; } cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...