#include <bits/stdc++.h>
using namespace std;
#define int long long
int L=1;
int R=1e9+10;
struct Node{
Node *l;
Node *r;
int val;
int lazy;
Node():val(0),lazy(0),l(nullptr),r(nullptr){};
};
void push(Node *root,int l,int r){
if(!root || !root->lazy)return;
root->val=(r-l+1);
if(l!=r){
if(!root->l)root->l=new Node();
if(!root->r)root->r=new Node();
root->l->lazy=1;
root->r->lazy=1;
}
root->lazy=0;
}
void update(Node *&root,int l,int r,int ql,int qr){
if(r<ql || l>qr)return;
if(!root)root=new Node();
push(root,l,r);
if(l>=ql && r<=qr){
root->lazy=1;
push(root,l,r);
return;
}
int mid=(l+r)>>1;
update(root->l,l,mid,ql,qr);
update(root->r,mid+1,r,ql,qr);
root->val=(root->l?root->l->val:0)+(root->r?root->r->val:0);
}
int query(Node* root,int l,int r,int ql,int qr){
if(!root || r<ql || l>qr)return 0;
push(root,l,r);
if(l>=ql && r<=qr)return (root?root->val:0);
int mid=(l+r)>>1;
return query(root->l,l,mid,ql,qr)+query(root->r,mid+1,r,ql,qr);
}
signed main(){
int t;
int c=0;
Node *node=nullptr;
cin>>t;
while(t--){
int type,l,r;
cin>>type>>l>>r;
if(type==1){
c=query(node,L,R,l+c,r+c);
cout<<c<<endl;
}else{
update(node,L,R,l+c,r+c);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |