Submission #307596

#TimeUsernameProblemLanguageResultExecution timeMemory
307596milleniumEeeeFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
524 ms13688 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAXN = (int)2e5 + 5;

int a[MAXN];
int tree[MAXN * 4], lazy[MAXN * 4];
int n, q, s, t;

void build(int v, int tl, int tr) {
  if (tl == tr) {
    tree[v] = a[tl];
    return;
  }
  int mid = (tl + tr) >> 1;
  build(v + v, tl, mid);
  build(v + v + 1, mid + 1, tr);
}

void push(int v, int tl, int tr) {
  if (!lazy[v]) { 
    return;
  }
  if (tl != tr) {
    lazy[v + v] += lazy[v];
    lazy[v + v + 1] += lazy[v];
  } else {
    tree[v] += lazy[v];
  }
  lazy[v] = 0;
}

void upd(int l, int r, int val, int v, int tl, int tr) {
  push(v, tl, tr);
  if (l <= tl && tr <= r) {
    lazy[v] = val;
    push(v, tl, tr);
    return;
  }
  if (l > tr || tl > r) {
    return;
  }
  int mid = (tl + tr) >> 1;
  upd(l, r, val, v + v, tl, mid);
  upd(l, r, val, v + v + 1, mid + 1, tr);
}

int get(int pos, int v, int tl, int tr) {
  if (pos == 0) { // case
    return 0;
  }
  
  push(v, tl, tr);
  if (tl == tr) {
    return tree[v];
  }
  int mid = (tl + tr) >> 1;
  if (pos <= mid) {
    return get(pos, v + v, tl, mid);
  } else {
    return get(pos, v + v + 1, mid + 1, tr);
  }
}

int calc(int i, int j) { // i < j
  int x = get(i, 1, 1, n);
  int y = get(j, 1, 1, n);
  int diff = abs(x - y);
  if (x < y) {
    return -(diff * s);
  } else {
    return diff * t;
  }
}


signed main() {
  cin >> n >> q >> s >> t;
  for (int i = 0; i <= n; i++) {
    scanf("%lld", &a[i]);
  }
  build(1, 1, n);
  int ans = 0;
  for (int i = 0; i < n; i++) {
    ans += calc(i, i + 1);
  }
  while (q--) {
    int l, r, val;
    scanf("%lld %lld %lld", &l, &r, &val);
    if (l - 1 >= 0) {
      ans -= calc(l - 1, l);
    }
    if (r + 1 <= n) {
      ans -= calc(r, r + 1);
    }
    upd(l, r, val, 1, 1, n);
    if (l - 1 >= 0) {
      ans += calc(l - 1, l);
    }
    if (r + 1 <= n) {
      ans += calc(r, r + 1);
    }
    printf("%lld\n", ans);
  }
}

Compilation message (stderr)

foehn_phenomena.cpp: In function 'int main()':
foehn_phenomena.cpp:81:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   81 |     scanf("%lld", &a[i]);
      |     ~~~~~^~~~~~~~~~~~~~~
foehn_phenomena.cpp:90:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   90 |     scanf("%lld %lld %lld", &l, &r, &val);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...