Submission #781358

#TimeUsernameProblemLanguageResultExecution timeMemory
781358michyMonkey and Apple-trees (IZhO12_apple)C++14
0 / 100
380 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

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

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

void update(Node *v, ll l, ll r) {
  push(v);
  if (l > v->tr || r < v->tl)
    return;
  if (l <= v->tl && v->tr <= r) {
    v->lazy = 1;
    v->sum = (v->tr - v->tl + 1);
    return;
  }
  if (v->left) update(v->left, l, r);
  if (v->right) update(v->right, 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(1, 1e9);
  ll ans = 0;
  while (q--) {
    ll op, l, r;
    cin >> op >> l >> r;
    l += ans; r += ans;
    if (op == 1) {
      ans = query(root, l, r);
      cout << ans << "\n";
    } else {
      update(root, l, r);
    }
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...