제출 #998413

#제출 시각아이디문제언어결과실행 시간메모리
998413amirhoseinfar1385원숭이와 사과 나무 (IZhO12_apple)C++17
100 / 100
58 ms16576 KiB
#include<bits/stdc++.h>
using namespace std;
int c;
struct node{
	int cl,cr;
	int res=0,f=0;
	node(){
		cl=cr=-1;
		res=f=0;
	}
}fakenode;
vector<node>all(1000000);
int te=1;

int getl(int u){
	if(all[u].cl==-1){
		all[u].cl=te;
		te++;
	}
	return all[u].cl;
}

int getr(int u){
	if(all[u].cr==-1){
		all[u].cr=te;
		te++;
	}
	return all[u].cr;
}

void upd(int u,int l,int r,int tl,int tr){
	if(l>r||l>tr||r<tl||tl>tr||all[u].f==1){
		return ;
	}
	if(l>=tl&&r<=tr){
		all[u].cl=all[u].cr=-1;
		all[u].res=r-l+1;
		all[u].f=1;
		return ;
	}
	int m=(l+r)>>1;
	upd(getl(u),l,m,tl,tr);
	upd(getr(u),m+1,r,tl,tr);
	all[u].res=(all[getr(u)]).res+(all[getl(u)].res);
}

int pors(int u,int l,int r,int tl,int tr){
	if(l>r||l>tr||r<tl||tl>tr||all[u].res==0){
		return 0;
	}
	if((all[u].f)==1){
		return min(r,tr)-max(l,tl)+1;
	}
	int m=(l+r)>>1;
	return pors(getl(u),l,m,tl,tr)+pors(getr(u),m+1,r,tl,tr);
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	for(int asd=0;asd<t;asd++){
		int qq;
		cin>>qq;
		int l,r;
		cin>>l>>r;
		l+=c;
		r+=c;
		if(qq==1){
			int res=pors(0,0,1073741824-1,l,r);
			cout<<res<<"\n";
			c=res;
		}else{
			upd(0,0,1073741824-1,l,r);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...