#include <bits/stdc++.h>
using namespace std;
#define fastio cin.tie(NULL)->sync_with_stdio(false)
#define ll long long
struct Node{
Node*lp=NULL,*rp=NULL;
ll val=0, lazy=0;
};
struct DynamicSeg{
Node*root = new Node();
void prop(Node*node, ll leftNode, ll rightNode){
if(node->lazy==0) return;
if(leftNode!=rightNode){
if(node->lp == NULL) node->lp = new Node();
if(node->rp == NULL) node->rp = new Node();
node->lp->lazy = 1;
node->rp->lazy = 1;
}
node->val = rightNode-leftNode+1;
node->lazy = 0;
}
void update_range(ll left, ll right, Node*node, ll leftNode, ll rightNode){
prop(node, leftNode, rightNode);
if(rightNode<left || right<leftNode) return;
if(left<=leftNode && rightNode<=right){
node->lazy = 1;
prop(node, leftNode, rightNode);
return;
}
ll mid = (leftNode+rightNode)/2;
if(node->lp == NULL) node->lp = new Node();
if(node->rp == NULL) node->rp = new Node();
update_range(left, right, node->lp, leftNode, mid);
update_range(left, right, node->rp, mid+1, rightNode);
node->val = node->lp->val + node->rp->val;
}
ll query(ll left, ll right, Node*node, ll leftNode, ll rightNode){
if(node==NULL) return 0;
prop(node, leftNode, rightNode);
if(rightNode<left || right<leftNode) return 0;
if(left<=leftNode && rightNode<=right) return node->val;
ll mid = (leftNode+rightNode)/2;
return query(left, right, node->lp, leftNode, mid) + query(left, right, node->rp, mid+1, rightNode);
}
};
int main(){
fastio;
ll M,C=0; cin>>M;
DynamicSeg Dseg;
while(M--){
ll q,l,r; cin>>q>>l>>r;
if(q==1){
ll ans = Dseg.query(l+C, r+C, Dseg.root, 1, 1e9);
cout<<ans<<'\n';
C = ans;
}
else Dseg.update_range(l+C, r+C, Dseg.root, 1, 1e9);
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |