Submission #146626

#TimeUsernameProblemLanguageResultExecution timeMemory
146626luciocfFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
427 ms20540 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; typedef long long ll; struct Node { ll sMaior=0, sMenor=0; } tree[4*maxn]; int n; int a[maxn]; ll bit[maxn]; void upd_bit(int x, int v) { for (; x < maxn; x += (x&-x)) bit[x] += 1ll*v; } ll soma(int x) { ll ans = 0; for (; x > 0; x -= (x&-x)) ans += bit[x]; return ans; } void build(int node, int l, int r) { if (l == r) { if (l < n && a[l] >= a[l+1]) tree[node].sMaior = (a[l]-a[l+1]); else if (l < n) tree[node].sMenor = (a[l+1]-a[l]); return; } int mid = (l+r)>>1; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node].sMaior = tree[2*node].sMaior + tree[2*node+1].sMaior; tree[node].sMenor = tree[2*node].sMenor + tree[2*node+1].sMenor; } void upd(int node, int l, int r, int pos, int op) { if (l == r) { ll val1 = 1ll*a[l] + soma(l); ll val2 = 1ll*a[l+1] + soma(l+1); if (val1 >= val2) { if (!op) tree[node].sMaior -= (val1-val2); else tree[node].sMaior += (val1-val2); } else { if (!op) tree[node].sMenor -= (val2-val1); else tree[node].sMenor += (val2-val1); } return; } int mid = (l+r)>>1; if (pos <= mid) upd(2*node, l, mid, pos, op); else upd(2*node+1, mid+1, r, pos, op); tree[node].sMaior = tree[2*node].sMaior + tree[2*node+1].sMaior; tree[node].sMenor = tree[2*node].sMenor + tree[2*node+1].sMenor; } int main(void) { int q, s, t; scanf("%d %d %d %d", &n, &q, &s, &t); for (int i = 0; i <= n; i++) scanf("%d", &a[i]); build(1, 0, n); for (int i = 1; i <= q; i++) { int l, r, d; scanf("%d %d %d", &l, &r, &d); upd(1, 0, n, l-1, 0); if (r != n) upd(1, 0, n, r, 0); upd_bit(l, d); upd_bit(r+1, -d); upd(1, 0, n, l-1, 1); if (r != n) upd(1, 0, n, r, 1); printf("%lld\n", 1ll*t*tree[1].sMaior - 1ll*s*tree[1].sMenor); } }

Compilation message (stderr)

foehn_phenomena.cpp: In function 'int main()':
foehn_phenomena.cpp:84:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d", &n, &q, &s, &t);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foehn_phenomena.cpp:87:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &a[i]);
   ~~~~~^~~~~~~~~~~~~
foehn_phenomena.cpp:94:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &l, &r, &d);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...