Submission #445127

#TimeUsernameProblemLanguageResultExecution timeMemory
445127erkeFoehn Phenomena (JOI17_foehn_phenomena)C++11
100 / 100
174 ms14712 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int N = 200005;

int n, q; ll s, t;

// n <= 2000 && q <= 2000
namespace sub1 {
  ll alti[N], temp[N];

  void Main() {
    for (int i = 0; i <= n; i++) {
      cin >> alti[i];
    }
    while (q--) {
      int l, r; ll x;
      cin >> l >> r >> x;
      for (int i = l; i <= r; i++) {
        alti[i] += x;
      }
      for (int i = 1; i <= n; i++) {
        if (alti[i - 1] < alti[i]) {
          temp[i] = temp[i - 1] - s * (alti[i] - alti[i - 1]);
        }
        else {
          temp[i] = temp[i - 1] + t * (alti[i - 1] - alti[i]);
        }
      }
      cout << temp[n] << '\n';
    }
  }
}

// s == t
namespace sub2 {
  ll alti[N];

  void Main() {
    for (int i = 0; i <= n; i++) {
      cin >> alti[i];
    }
    while (q--) {
      int l, r; ll x;
      cin >> l >> r >> x;
      if (r == n) alti[n] += x;
      cout << alti[n] * (-t) << '\n';
    }
  }
}

struct Bit {
  vector<ll> bit;
  Bit(int n): bit(n + 1) {}
  void update(int i, ll v) {
    for (; i < (int) bit.size(); i += i & -i) {
      bit[i] += v;
    }
  }
  ll get(int i) {
    ll v = 0;
    for (; i; i -= i & -i) {
      v += bit[i];
    }
    return v;
  }
};

namespace sub3 {
  ll a[N], diff[N];

  void updDiff(Bit &alti, int p) {
    if (p > n) return;
    diff[p] = alti.get(p) - alti.get(p - 1);
  }

  void addAns(ll &ans, int p) {
    if (p > n) return;
    if (diff[p] > 0) ans -= s * diff[p];
    else ans += t * (-diff[p]);
  }

  void remAns(ll &ans, int p) {
    if (p > n) return;
    if (diff[p] > 0) ans += s * diff[p];
    else ans -= t * (-diff[p]);
  }

  void Main() {
    ll ans = 0;
    Bit alti(n + 1);
    for (int i = 0; i <= n; i++) {
      cin >> a[i];
      if (i > 0) {
        diff[i] = a[i] - a[i - 1];
        alti.update(i, diff[i]);
        if (diff[i] > 0) ans -= s * diff[i];
        else ans += t * (-diff[i]);
      }
    }
    while (q--) {
      int l, r; ll x;
      cin >> l >> r >> x;
      remAns(ans, l);
      remAns(ans, r + 1);
      alti.update(l, x);
      alti.update(r + 1, -x);
      updDiff(alti, l);
      updDiff(alti, r + 1);
      addAns(ans, l);
      addAns(ans, r + 1);
      cout << ans << '\n';
    }
  }
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> q >> s >> t;
  if (n <= 2000 && q <= 2000) sub1::Main();
  else if (s == t) sub2::Main();
  else sub3::Main();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...