Submission #706875

# Submission time Handle Problem Language Result Execution time Memory
706875 2023-03-08T02:30:29 Z nhuang685 Monkey and Apple-trees (IZhO12_apple) C++17
100 / 100
417 ms 250444 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 = int;

  st2 sz;
  struct Node {
    T val, 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) {
    assert(ind != -1);
    if (l != 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) return;
    data[ind].val = OP::all(l, r, data[ind].ls);
    if (l != r) {
      data[data[ind].l].ls = data[ind].ls;
      data[data[ind].r].ls = data[ind].ls;
    }
    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, int ind, st2 l, st2 r) {
    assert(ind != -1);
    push(ind, l, r);
    if (a <= l && r <= b) {
      data[ind].ls = v;
      push(ind, l, r);
      return;
    } else if (r < a || b < l)
      return;

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

    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.reserve(64 * 123456);
    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, 0, 0, sz - 1); }
  void set(st2 i, T v) { modify(i, i, v, 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 336 KB Output is correct
4 Correct 16 ms 3140 KB Output is correct
5 Correct 17 ms 3792 KB Output is correct
6 Correct 19 ms 3676 KB Output is correct
7 Correct 19 ms 3984 KB Output is correct
8 Correct 126 ms 26948 KB Output is correct
9 Correct 253 ms 44476 KB Output is correct
10 Correct 271 ms 50944 KB Output is correct
11 Correct 273 ms 55228 KB Output is correct
12 Correct 263 ms 57024 KB Output is correct
13 Correct 255 ms 70184 KB Output is correct
14 Correct 249 ms 70620 KB Output is correct
15 Correct 403 ms 248268 KB Output is correct
16 Correct 399 ms 248288 KB Output is correct
17 Correct 251 ms 72908 KB Output is correct
18 Correct 252 ms 73036 KB Output is correct
19 Correct 404 ms 250316 KB Output is correct
20 Correct 417 ms 250444 KB Output is correct