CompProgLibrary

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub RTnF/CompProgLibrary

:heavy_check_mark: cpp/segment_tree/segment_tree_beats_sum.hpp

Depends on

Verified with

Code

#include "template/small_template.hpp"

// https://tjkendev.github.io/procon-library/cpp/range_query/segment_tree_beats_2.html
// sumがあるのでINFは積めない
class SegmentTreeBeatsSum {
  int n, n0;
  vector<ll> max_v, smax_v, max_c;
  vector<ll> min_v, smin_v, min_c;
  vector<ll> sum;
  vector<ll> len, ladd, lval;

  void update_node_max(int k, ll x) {
    sum[k] += (x - max_v[k]) * max_c[k];
    if (max_v[k] == min_v[k]) {
      max_v[k] = min_v[k] = x;
    } else if (max_v[k] == smin_v[k]) {
      max_v[k] = smin_v[k] = x;
    } else {
      max_v[k] = x;
    }
    if (lval[k] != INF && x < lval[k]) {
      lval[k] = x;
    }
  }

  void update_node_min(int k, ll x) {
    sum[k] += (x - min_v[k]) * min_c[k];
    if (max_v[k] == min_v[k]) {
      max_v[k] = min_v[k] = x;
    } else if (smax_v[k] == min_v[k]) {
      min_v[k] = smax_v[k] = x;
    } else {
      min_v[k] = x;
    }
    if (lval[k] != INF && lval[k] < x) {
      lval[k] = x;
    }
  }

  void push(int k) {
    if (n0 - 1 <= k) {
      return;
    }
    if (lval[k] != INF) {
      update_all(2 * k + 1, lval[k]);
      update_all(2 * k + 2, lval[k]);
      lval[k] = INF;
      return;
    }
    if (ladd[k] != 0) {
      add_all(2 * k + 1, ladd[k]);
      add_all(2 * k + 2, ladd[k]);
      ladd[k] = 0;
    }
    if (max_v[k] < max_v[2 * k + 1]) {
      update_node_max(2 * k + 1, max_v[k]);
    }
    if (min_v[2 * k + 1] < min_v[k]) {
      update_node_min(2 * k + 1, min_v[k]);
    }
    if (max_v[k] < max_v[2 * k + 2]) {
      update_node_max(2 * k + 2, max_v[k]);
    }
    if (min_v[2 * k + 2] < min_v[k]) {
      update_node_min(2 * k + 2, min_v[k]);
    }
  }

  void update(int k) {
    sum[k] = sum[2 * k + 1] + sum[2 * k + 2];
    if (max_v[2 * k + 1] < max_v[2 * k + 2]) {
      max_v[k] = max_v[2 * k + 2];
      max_c[k] = max_c[2 * k + 2];
      smax_v[k] = max(max_v[2 * k + 1], smax_v[2 * k + 2]);
    } else if (max_v[2 * k + 1] > max_v[2 * k + 2]) {
      max_v[k] = max_v[2 * k + 1];
      max_c[k] = max_c[2 * k + 1];
      smax_v[k] = max(smax_v[2 * k + 1], max_v[2 * k + 2]);
    } else {
      max_v[k] = max_v[2 * k + 1];
      max_c[k] = max_c[2 * k + 1] + max_c[2 * k + 2];
      smax_v[k] = max(smax_v[2 * k + 1], smax_v[2 * k + 2]);
    }
    if (min_v[2 * k + 1] < min_v[2 * k + 2]) {
      min_v[k] = min_v[2 * k + 1];
      min_c[k] = min_c[2 * k + 1];
      smin_v[k] = min(smin_v[2 * k + 1], min_v[2 * k + 2]);
    } else if (min_v[2 * k + 1] > min_v[2 * k + 2]) {
      min_v[k] = min_v[2 * k + 2];
      min_c[k] = min_c[2 * k + 2];
      smin_v[k] = min(min_v[2 * k + 1], smin_v[2 * k + 2]);
    } else {
      min_v[k] = min_v[2 * k + 1];
      min_c[k] = min_c[2 * k + 1] + min_c[2 * k + 2];
      smin_v[k] = min(smin_v[2 * k + 1], smin_v[2 * k + 2]);
    }
  }

  void _chmin(ll x, int a, int b, int k, int l, int r) {
    if (b <= l || r <= a || max_v[k] <= x) {
      return;
    }
    if (a <= l && r <= b && smax_v[k] < x) {
      update_node_max(k, x);
      return;
    }
    push(k);
    _chmin(x, a, b, 2 * k + 1, l, (l + r) / 2);
    _chmin(x, a, b, 2 * k + 2, (l + r) / 2, r);
    update(k);
  }

  void _chmax(ll x, int a, int b, int k, int l, int r) {
    if (b <= l || r <= a || x <= min_v[k]) {
      return;
    }
    if (a <= l && r <= b && x < smin_v[k]) {
      update_node_min(k, x);
      return;
    }
    push(k);
    _chmax(x, a, b, 2 * k + 1, l, (l + r) / 2);
    _chmax(x, a, b, 2 * k + 2, (l + r) / 2, r);
    update(k);
  }

  void add_all(int k, ll x) {
    max_v[k] += x;
    if (smax_v[k] != -INF) {
      smax_v[k] += x;
    }
    min_v[k] += x;
    if (smin_v[k] != INF) {
      smin_v[k] += x;
    }

    sum[k] += len[k] * x;
    (lval[k] == INF ? ladd[k] : lval[k]) += x;
  }

  void update_all(int k, ll x) {
    max_v[k] = x;
    smax_v[k] = -INF;
    min_v[k] = x;
    smin_v[k] = INF;
    max_c[k] = min_c[k] = len[k];

    sum[k] = x * len[k];
    lval[k] = x;
    ladd[k] = 0;
  }

  void _add_val(ll x, int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) {
      return;
    }
    if (a <= l && r <= b) {
      add_all(k, x);
      return;
    }

    push(k);
    _add_val(x, a, b, 2 * k + 1, l, (l + r) / 2);
    _add_val(x, a, b, 2 * k + 2, (l + r) / 2, r);
    update(k);
  }

  void _update_val(ll x, int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) {
      return;
    }
    if (a <= l && r <= b) {
      update_all(k, x);
      return;
    }
    push(k);
    _update_val(x, a, b, 2 * k + 1, l, (l + r) / 2);
    _update_val(x, a, b, 2 * k + 2, (l + r) / 2, r);
    update(k);
  }

  ll _calc_max(int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) {
      return -INF;
    }
    if (a <= l && r <= b) {
      return max_v[k];
    }
    push(k);
    ll lv = _calc_max(a, b, 2 * k + 1, l, (l + r) / 2);
    ll rv = _calc_max(a, b, 2 * k + 2, (l + r) / 2, r);
    return max(lv, rv);
  }

  ll _calc_min(int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) {
      return INF;
    }
    if (a <= l && r <= b) {
      return min_v[k];
    }
    push(k);
    ll lv = _calc_min(a, b, 2 * k + 1, l, (l + r) / 2);
    ll rv = _calc_min(a, b, 2 * k + 2, (l + r) / 2, r);
    return min(lv, rv);
  }

  ll _calc_sum(int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) {
      return 0;
    }
    if (a <= l && r <= b) {
      return sum[k];
    }
    push(k);
    ll lv = _calc_sum(a, b, 2 * k + 1, l, (l + r) / 2);
    ll rv = _calc_sum(a, b, 2 * k + 2, (l + r) / 2, r);
    return lv + rv;
  }

public:
  SegmentTreeBeatsSum(vector<ll> a) : n(a.size()) {
    max_v = smax_v = max_c = min_v = smin_v = min_c = sum = len = ladd = lval =
        vector<ll>(4 * n);
    n0 = 1;
    while (n0 < n)
      n0 <<= 1;

    for (int i = 0; i < 2 * n0; ++i)
      ladd[i] = 0, lval[i] = INF;
    len[0] = n0;
    for (int i = 0; i < n0 - 1; ++i)
      len[2 * i + 1] = len[2 * i + 2] = (len[i] >> 1);

    for (int i = 0; i < n; ++i) {
      max_v[n0 - 1 + i] = min_v[n0 - 1 + i] = sum[n0 - 1 + i] = a[i];
      smax_v[n0 - 1 + i] = -INF;
      smin_v[n0 - 1 + i] = INF;
      max_c[n0 - 1 + i] = min_c[n0 - 1 + i] = 1;
    }

    for (int i = n; i < n0; ++i) {
      max_v[n0 - 1 + i] = smax_v[n0 - 1 + i] = -INF;
      min_v[n0 - 1 + i] = smin_v[n0 - 1 + i] = INF;
      max_c[n0 - 1 + i] = min_c[n0 - 1 + i] = 0;
    }
    for (int i = n0 - 2; i >= 0; i--) {
      update(i);
    }
  }

  void chmin(int a, int b, ll x) { _chmin(x, a, b, 0, 0, n0); }
  void chmax(int a, int b, ll x) { _chmax(x, a, b, 0, 0, n0); }
  void add_val(int a, int b, ll x) { _add_val(x, a, b, 0, 0, n0); }
  void update_val(int a, int b, ll x) { _update_val(x, a, b, 0, 0, n0); }
  ll calc_max(int a, int b) { return _calc_max(a, b, 0, 0, n0); }
  ll calc_min(int a, int b) { return _calc_min(a, b, 0, 0, n0); }
  ll calc_sum(int a, int b) { return _calc_sum(a, b, 0, 0, n0); }
};
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.12.0/x64/lib/python3.12/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.12.0/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/cplusplus.py", line 187, in bundle
    bundler.update(path)
  File "/opt/hostedtoolcache/Python/3.12.0/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/cplusplus_bundle.py", line 401, in update
    self.update(self._resolve(pathlib.Path(included), included_from=path))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.12.0/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/cplusplus_bundle.py", line 260, in _resolve
    raise BundleErrorAt(path, -1, "no such header")
onlinejudge_verify.languages.cplusplus_bundle.BundleErrorAt: template/small_template.hpp: line -1: no such header
Back to top page