#include <iostream>
using namespace std;
int N = (1<<30) + 1, n;
struct node{
node *lft, *rgt;
bool full = 0, null = 1;
void set(int l, int r, int st = 1, int en = N){
if (l >= en or r <= st or full)
return;
if (l <= st and r >= en){
full = 1;
return;
}
int mid = (st + en) / 2;
if (null)
lft = new node(), rgt = new node(), null = 0;
lft->set(l, r, st, mid);
rgt->set(l, r, mid, en);
full = lft->full & rgt->full;
}
int get(int l, int r, int st = 1, int en = N){
if (l >= en or r <= st or (full == 0 and null))
return 0;
if (full)
return max(0, min(r, en) - max(l, st));
int mid = (st + en) / 2;
return lft->get(l, r, st, mid) + rgt->get(l, r, mid, en);
}
};
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin>>n;
node *rt = new node();
for (int i=1, t, l, r, c = 0;i<=n;i++){
cin>>t>>l>>r;
l += c, r += c;
if (t == 2)
rt->set(l, r + 1);
else
c = rt->get(l, r + 1), cout<<c<<'\n';
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |