Submission #706136

# Submission time Handle Problem Language Result Execution time Memory
706136 2023-03-06T01:09:48 Z nhuang685 Monkey and Apple-trees (IZhO12_apple) C++17
0 / 100
511 ms 262144 KB
/**
 * @author nhuang685
 * @date 2023-03-05 19:26:54
 */
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

template <class OP>
class LazySegmentTree {
 private:
  using T = typename decay<decltype(OP::ID)>::type;
  using st2 = long long;

  st2 sz;
  struct Node {
    T val, la = 0, ls = OP::ID2;
    // st2 ind;
    int l = -1, r = -1;
    Node() : val(OP::ID) {}
    Node(T _val) : val(_val) {}
  };
  vector<Node> data;

  void push(int ind, st2 l, st2 r) {
    if (data[ind].l == -1) {
      data.push_back(Node());
      data[ind].l = (int)data.size() - 1;
    }
    if (data[ind].r == -1) {
      data.push_back(Node());
      data[ind].r = (int)data.size() - 1;
    }
    if (data[ind].ls == OP::ID2) {
      if (data[ind].la == 0) return;
      data[ind].val += OP::all(l, r, data[ind].la);
      if (l != r) {
        data[data[ind].l].la += data[ind].la;
        data[data[ind].r].la += data[ind].la;
      }
      data[ind].la = 0;
    } else {
      data[ind].ls += data[ind].la;
      data[ind].la = 0;

      data[ind].val = OP::all(l, r, data[ind].ls);
      if (l != r) {
        data[data[ind].l].ls = data[ind].ls;
        data[data[ind].l].la = 0;
        data[data[ind].r].ls = data[ind].ls;
        data[data[ind].r].la = 0;
      }
      data[ind].ls = OP::ID2;
    }
  }
  void pull(int i) {
    data[i].val = OP::comb((data[i].l == -1) ? OP::ID : data[data[i].l].val,
                           (data[i].r == -1) ? OP::ID : data[data[i].r].val);
  }

  void modify(st2 a, st2 b, T v, bool add, int ind, st2 l, st2 r) {
    push(ind, l, r);
    if (r < a || b < l) return;
    if (a <= l && r <= b) {
      if (add)
        data[ind].la += v;
      else
        data[ind].ls = v;
      push(ind, l, r);
      return;
    }

    st2 mid = (l + r) / 2;
    modify(a, b, v, add, data[ind].l, l, mid);
    modify(a, b, v, add, data[ind].r, mid + 1, r);
    pull(ind);
  }
  T query(st2 a, st2 b, int ind, st2 l, st2 r) {
    push(ind, l, r);
    if (r < a || b < l) return OP::ID;
    if (a <= l && r <= b) return data[ind].val;

    st2 mid = (l + r) / 2;
    return OP::comb(query(a, b, data[ind].l, l, mid),
                    query(a, b, data[ind].r, mid + 1, r));
  }

 public:
  LazySegmentTree() {}
  LazySegmentTree(st2 _sz) {
    sz = 1;
    while (sz < _sz) sz *= 2;
    data.push_back(Node());
  }
  LazySegmentTree(const vector<T> &arr) {
    sz = 1;
    while (sz < (st2)arr.size()) sz *= 2;

    auto build = [&](auto &self, st2 l, st2 r) -> int {
      if (l == r) {
        data.push_back(Node(arr[l]));
        return (int)data.size() - 1;
      }

      data.push_back(Node());
      int ind = (int)data.size() - 1;

      st2 mid = (l + r) / 2;
      auto tmp = self(self, l, mid);
      data[ind].l = tmp;
      if ((st2)arr.size() - 1 >= mid + 1) {
        tmp = self(self, mid + 1, r);
        data[ind].r = tmp;
      }
      pull(ind);
      return ind;
    };
    build(build, 0, sz - 1);
  }

  void set(st2 a, st2 b, T v) { modify(a, b, v, false, 0, 0, sz - 1); }
  void set(st2 i, T v) { modify(i, i, v, false, 0, 0, sz - 1); }
  void add(st2 a, st2 b, T v) { modify(a, b, v, true, 0, 0, sz - 1); }
  void add(st2 i, T v) { modify(i, i, v, true, 0, 0, sz - 1); }
  T query(st2 a, st2 b) { return query(a, b, 0, 0, sz - 1); }
};
template <class T>
struct Add {
  static constexpr T ID = 0, ID2 = -1;  // change ID2 as needed
  static T comb(T a, T b) { return a + b; }
  template <class U>
  static T all([[maybe_unused]] U l, [[maybe_unused]] U r, T v) {
    return (r - l + 1) * v;
  }
};
template <class T>
using Seg = LazySegmentTree<Add<T>>;

int main() {
  ios::sync_with_stdio(false);

#ifdef LOCAL
  // freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  freopen("log.txt", "w", stderr);
#else
  cin.tie(nullptr);
#endif

  Seg<int> seg((ll)1e9 + 1);

  int M;
  cin >> M;
  ll C = 0;
  while (M--) {
    int D;
    ll X, Y;
    cin >> D >> X >> Y;
    if (D == 1)
      cout << (C = seg.query(X + C, Y + C)) << '\n';
    else
      seg.set(X + C, Y + C, 1);
  }
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 18 ms 5728 KB Output is correct
5 Correct 23 ms 5700 KB Output is correct
6 Correct 21 ms 5664 KB Output is correct
7 Correct 21 ms 5736 KB Output is correct
8 Correct 157 ms 42204 KB Output is correct
9 Correct 315 ms 83852 KB Output is correct
10 Correct 328 ms 83720 KB Output is correct
11 Correct 342 ms 83752 KB Output is correct
12 Correct 344 ms 83696 KB Output is correct
13 Correct 349 ms 167040 KB Output is correct
14 Correct 350 ms 167156 KB Output is correct
15 Runtime error 511 ms 262144 KB Execution killed with signal 9
16 Halted 0 ms 0 KB -