Submission #597762

#TimeUsernameProblemLanguageResultExecution timeMemory
597762Shreyan_PaliwalMonkey and Apple-trees (IZhO12_apple)C++17
0 / 100
1 ms212 KiB
#include <bits/stdc++.h>
using namespace std;

struct Node {
  int   v    = 0, l, r;
  Node* c[2] = { nullptr, nullptr };

  bool f() { return (v == (r - l + 1)); }

  Node* ML() {
    if (c[0]) return c[0];
    c[0]    = new Node;
    int m   = (l + r) >> 1;
    c[0]->l = l, c[0]->r = m;
    if (f()) c[0]->set();
    return c[0];
  }

  Node* MR() {
    if (c[1]) return c[1];
    c[1]    = new Node;
    int m   = (l + r) >> 1;
    c[1]->l = m + 1, c[1]->r = r;
    if (f()) c[1]->set();
    return c[1];
  }

  void set() { v = (r - l + 1); }

  int val(int k) { return (c[k] ? c[k]->v : 0); }

  void merge() { v = val(0) + val(1); }

  void push() {
    if (!f()) return;
    if (l != r) {
      if (c[0]) c[0]->set();
      if (c[1]) c[1]->set();
    }
  }

  void upd(int L, int R) {
    push();
    if (R < l || r < L) return;
    if (L <= l && r <= R) {
      set();
      return;
    }
    ML()->upd(L, R);
    MR()->upd(L, R);
    merge();
  }

  int qry(int L, int R) {
    push();
    if (R < l || r < L) return 0;
    if (L <= l && r <= R) return v;
    return ML()->qry(L, R) + MR()->qry(L, R);
  }
};

int n;

int main() {
  // freopen("main.in", "r", stdin);

  Node* seg = new Node;
  seg->l = 1, seg->r = 100000;

  cin >> n;

  for (int i = 0; i < n; i++) {
    int D, X, Y;
    cin >> D >> X >> Y;
    if (D == 2)
      seg->upd(X, Y);
    else
      cout << seg->qry(X, Y) << '\n';
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...