Submission #1166794

#TimeUsernameProblemLanguageResultExecution timeMemory
1166794LucasLeFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
262 ms13868 KiB
#include <bits/stdc++.h> #define i64 long long template<typename T> bool minimize(T &x, T y) { if (x > y) { x = y; return true; } return false; } template<typename T> bool maximize(T &x, T y) { if (x < y) { x = y; return true; } return false; } const int MOD = 998244353; template<typename T> void add(T &x, T y) { x += y; if (x >= MOD) x -= MOD; if (x < 0) x += MOD; } template<typename T> T bin_pow(T x, T y) { T res = 1; if (y < 0) return 1; while (y) { if (y & 1) res = res * x % MOD; x = x * x % MOD; y >>= 1; } return res; } const int maxn = 2e5 + 5; int n, q, s, t; long long a[maxn + 5]; struct segment_tree { long long t[4 * maxn + 5]; long long lazy[4 * maxn + 5]; void build(int id, int l, int r) { if (l == r) { t[id] = a[l]; return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); t[id] = t[id << 1] + t[id << 1 | 1]; } void push(int id, int l, int r) { t[id] += lazy[id]; if (l != r) { lazy[id << 1] += lazy[id]; lazy[id << 1 | 1] += lazy[id]; } lazy[id] = 0; } void update(int id, int l, int r, int lb, int rb, int x) { push(id, l, r); if (lb <= l && r <= rb) { lazy[id] += x; push(id, l, r); return; } int mid = (l + r) >> 1; if (lb <= mid) update(id << 1, l, mid, lb, rb, x); if (rb >= mid + 1) update(id << 1 | 1, mid + 1, r, lb, rb, x); t[id] = t[id << 1] + t[id << 1 | 1]; } long long query(int id, int l, int r, int pos) { push(id, l, r); if (l == r) { return t[id]; } int mid = (l + r) >> 1; long long a = 0, b = 0; if (pos <= mid) a = query(id << 1, l, mid, pos); if (pos > mid) b = query(id << 1 | 1, mid + 1, r, pos); return a + b; } void update(int l, int r, int x) { update(1, 1, n, l, r, x); } long long query(int pos) { return query(1, 1, n, pos); } }; segment_tree seg; void solve() { std::cin >> n >> q >> s >> t; for (int i = 0; i <= n; ++i) std::cin >> a[i]; seg.build(1, 1, n); long long ans = 0; for (int i = 1; i <= n; ++i) { long long diff = a[i] - a[i - 1]; if (diff > 0) { ans -= diff * s; } else { diff = -diff; ans += diff * t; } } while (q--) { int l, r, x; std::cin >> l >> r >> x; if (l - 1 > 0) a[l - 1] = seg.query(l - 1); if (r + 1 <= n) a[r + 1] = seg.query(r + 1); a[l] = seg.query(l); a[r] = seg.query(r); { long long diff = a[l] - a[l - 1]; if (diff > 0) { ans += diff * s; } else { diff = -diff; ans -= diff * t; } } if (r + 1 <= n) { long long diff = a[r + 1] - a[r]; if (diff > 0) { ans += diff * s; } else { diff = -diff; ans -= diff * t; } } seg.update(l, r, x); a[l] = seg.query(l); a[r] = seg.query(r); { long long diff = a[l] - a[l - 1]; if (diff > 0) { ans -= diff * s; } else { diff = -diff; ans += diff * t; } } if (r + 1 <= n) { long long diff = a[r + 1] - a[r]; if (diff > 0) { ans -= diff * s; } else { diff = -diff; ans += diff * t; } } std::cout << ans << '\n'; } } int main() { // std::freopen("input.txt", "r", stdin); // std::freopen("KHOANG.inp", "r", stdin); // std::freopen("KHOANG.out", "w", stdout); std::ios_base::sync_with_stdio(false); std::cin.tie(0); clock_t start = clock(); int tc = 1; // std::cin >> tc; while (tc--) solve(); std::cerr << "Time elapsed: " << clock() - start << " ms\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...