제출 #781386

#제출 시각아이디문제언어결과실행 시간메모리
781386michy원숭이와 사과 나무 (IZhO12_apple)C++14
100 / 100
449 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;

struct Node {
  int sum, lazy;
  Node *left, *right;
  Node() : sum(0), lazy(0), left(nullptr), right(nullptr) {}
};
  
void push(Node *v, int tl, int tr) {
  if (tl == tr) return;
  int tm = (tl + tr) / 2;
  if (!v->left) v->left = new Node();
  if (!v->right) v->right = new Node();
  if (v->lazy == 1) {
    v->left->sum = tm - tl + 1;
    v->right->sum = tr - tm;
    v->left->lazy = 1;
    v->right->lazy = 1;
    v->lazy = 0;
  }
}

int query(Node *v, int tl, int tr, int l, int r) {
  push(v, tl, tr);
  if (l > tr || r < tl)
    return 0;
  if (l <= tl && tr <= r)
    return v->sum;
  int tm = (tl + tr) / 2;
  return (v->left ? query(v->left, tl, tm, l, r) : 0) + (v->right ? query(v->right, tm+1, tr, l, r) : 0);
}

void update(Node *v, int tl, int tr, int l, int r) {
  push(v, tl, tr);
  if (l > tr || r < tl)
    return;
  if (l <= tl && tr <= r) {
    v->lazy = 1;
    v->sum = tr - tl + 1;
    return;
  }
  int tm = (tl + tr) / 2;
  if (v->left) update(v->left, tl, tm, l, r);
  if (v->right) update(v->right, tm+1, tr, l, r);
  v->sum = (v->left ? v->left->sum : 0) + (v->right ? v->right->sum : 0);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int q;
  cin >> q;
  Node *root = new Node();
  int ans = 0;
  while (q--) {
    int op, l, r;
    cin >> op >> l >> r;
    l += ans; r += ans;
    if (op == 1) {
      ans = query(root, 1, 1e9, l, r);
      cout << ans << "\n";
    } else {
      update(root, 1, 1e9, l, r);
    }
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...