#include <bits/stdc++.h>
using namespace std;
#define int long long
int mod = 1e9 + 7;
struct Node {
bool lset = false, rset = false, flagged = false;
Node* left;
Node* right;
int lrange, rrange, val = 0;
};
void fillNodes(Node* n) {
int l = n->lrange, r = n->rrange;
if (r - l > 1) {
int m = (l+r)/2;
if (!n->lset) {
n->left = new Node();
n->left->lrange = l;
n->left->rrange = m;
n->lset = true;
}
if (!n->rset) {
n->right = new Node();
n->right->lrange = m;
n->right->rrange = r;
n->rset = true;
}
}
}
void update(Node* n, int tl, int tr) {
int l = n->lrange, r = n->rrange;
if (l >= tr || r <= tl) return;
if (l >= tl && r <= tr) {
n->flagged = true;
n->val = r - l;
return;
}
if (n->flagged) return;
fillNodes(n);
update(n->left, tl, tr);
update(n->right, tl, tr);
if (!n->flagged) {
n->val = n->left->val + n->right->val;
}
}
int query(Node* n, int tl, int tr) {
int l = n->lrange, r = n->rrange;
if (l >= tr || r <= tl) return 0;
if (n->flagged) {
return min(r, tr) - max(l, tl);
}
if (l >= tl && r <= tr) return n->val;
fillNodes(n);
return query(n->left, tl, tr) + query(n->right, tl, tr);
}
Node* root = new Node();
int bruh = 0;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
root->lrange = 0;
root->rrange = (int)1e9;
int N, a, b, c;
cin>>N;
for (int i = 0; i < N; ++i) {
cin>>a>>b>>c;
b += bruh, c += bruh;
if (a == 1) {
int smh = query(root, b - 1, c);
cout<<smh<<'\n';
bruh = smh;
} else if (a == 2) {
update(root, b-1, c);
}
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |