Submission #755284

#TimeUsernameProblemLanguageResultExecution timeMemory
755284DonMichael원숭이와 사과 나무 (IZhO12_apple)C++14
100 / 100
96 ms3020 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>

using namespace std;

static constexpr int N = 1e9;
static constexpr int LGN = 30;
static constexpr int M = 1e5;

struct Node {
  Node(void) = default;
  Node(int l, int r);

  int cl, cr;
  int l, r;
  bool red;
};

class DynamicSegmentTree {
public:
  DynamicSegmentTree(void);
  int query(int l, int r);
  void modify(int l, int r);
private:
  void add_left(int i);
  void add_right(int i);
  int _query(int i, int l, int r);
  void _modify(int i, int l, int r);

  Node t[M * LGN * 2];
  int cnt;
};

Node::Node(int l, int r): cl(0), cr(0), l(l), r(r), red(false) {
}

DynamicSegmentTree::DynamicSegmentTree(void): cnt(2) {
  t[1] = Node(0, N);
}

void DynamicSegmentTree::add_left(int i) {
  int c = t[i].cl = cnt++;
  t[c] = Node(t[i].l, (t[i].l + t[i].r) >> 1);
}

void DynamicSegmentTree::add_right(int i) {
  int c = t[i].cr = cnt++;
  t[c] = Node((t[i].l + t[i].r) >> 1, t[i].r);
}

int DynamicSegmentTree::_query(int i, int l, int r) {
  if (t[i].red)
    return r - l;
  int mid = (t[i].l + t[i].r) >> 1;
  if (r <= mid) {
    if (!t[i].cl)
      return 0;
    return _query(t[i].cl, l, r);
  }
  if (l >= mid) {
    if (!t[i].cr)
      return 0;
    return _query(t[i].cr, l, r);
  }
  int s = 0;
  if (t[i].cl)
    s += _query(t[i].cl, l, mid);
  if (t[i].cr)
    s += _query(t[i].cr, mid, r);
  return s;
}

inline int DynamicSegmentTree::query(int l, int r) {
  return _query(1, l, r);
}

void DynamicSegmentTree::_modify(int i, int l, int r) {
  if (t[i].red)
    return;
  if (t[i].l == l && t[i].r == r) {
    t[i].red = true;
  } else {
    int mid = (t[i].l + t[i].r) >> 1;
    if (r <= mid) {
      if (!t[i].cl)
        add_left(i);
      _modify(t[i].cl, l, r);
    } else if (l >= mid) {
      if (!t[i].cr)
        add_right(i);
      _modify(t[i].cr, l, r);
    } else {
      if (!t[i].cl)
        add_left(i);
      if (!t[i].cr)
        add_right(i);
      _modify(t[i].cl, l, mid);
      _modify(t[i].cr, mid, r);
    }
  }
}

inline void DynamicSegmentTree::modify(int l, int r) {
  _modify(1, l, r);
}

static DynamicSegmentTree dst;

int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int m, c = 0;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int d, x, y;
    cin >> d >> x >> y;
    if (d == 1)
      cout << (c = dst.query(c + x - 1, c + y)) << endl;
    else
      dst.modify(c + x - 1, c + y);
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...