#include <bits/stdc++.h>
// #define int long long
using namespace std;
struct dynamicsegtreefake{
map<int, int> tr;
void update(int node, int start, int end, int l, int r){
// propa(node, start, end);
if(start > r or end < l){
return;
}
if(l<=start and end<=r){
tr[node] = (end-start+1);
return;
}
int mid = (start+end)/2;
update(2*node, start, mid, l, r);
update(2*node+1, mid+1, end, l, r);
if(tr[node]==(end-start+1)){
return;
}else tr[node] = 0;
if(tr.find(2*node)!=tr.end())tr[node] += tr[2*node];
if(tr.find(2*node+1)!=tr.end())tr[node] += tr[2*node+1];
}
int query(int node, int start, int end, int l, int r, int tag){
// propa(node, start, end);
if(start > r or end < l){
return 0;
}
if(tr[node]==(end-start+1))tag = 1;
if(l<=start and end<=r){
if(tag==1)return (end-start+1);
else return tr[node];
}
int mid = (start+end)/2;
return query(2*node, start, mid, l, r, tag) + query(2*node+1, mid+1, end, l, r, tag);
}
};
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int m;
cin >> m;
int c = 0;
dynamicsegtreefake st;
while(m--){
int d, x, y;
cin >> d >> x >> y;
x += c, y += c;
if(d==2){
st.update(1, 1, (int)1e9, x, y);
}else{
// cout << st.tr[268435457];
// return 0;
c = st.query(1, 1, (int)1e9, x, y, 0);
cout << c << '\n';
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |