Pagini recente » Cod sursa (job #74638) | Cod sursa (job #2176674) | Cod sursa (job #2224054) | Cod sursa (job #1011276) | Cod sursa (job #1877827)
#include<fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arbint{int best,left,right;};
arbint arb[500000];
int x,y,op;
void build_arbint(int node,int left,int right){
arb[node].best=arb[node].left=arb[node].right=right-left+1;
if(left==right)
return;
build_arbint(2*node,left,(left+right)/2);
build_arbint(2*node+1,(left+right)/2+1,right);
}
int maxim(int a,int b){
if(a<b)
return b;
return a;
}
void update(int node,int left,int right){
int middle=(left+right)/2;
if(left>y||right<x)
return;
if(x<=left&&right<=y){
if(op==1)
arb[node].best=arb[node].left=arb[node].right=0;
else
arb[node].best=arb[node].left=arb[node].right=right-left+1;
return;
}
if(arb[node].best==0)
arb[2*node].best=arb[2*node].left=arb[2*node].right=arb[2*node+1].best=arb[node*2+1].left=arb[2*node+1].right=0;
if(arb[node].best==right-left+1){
arb[2*node].best=arb[2*node].left=arb[2*node].right=middle-left+1;
arb[2*node+1].best=arb[2*node+1].left=arb[2*node+1].right=right-middle;
}
update(2*node,left,middle);
update(2*node+1,middle+1,right);
arb[node].best=maxim(maxim(arb[2*node].best,arb[2*node+1].best),arb[2*node].right+arb[2*node+1].left);
arb[node].left=arb[2*node].left;
arb[node].right=arb[2*node+1].right;
if(arb[2*node].left==middle-left+1)
arb[node].left+=arb[2*node+1].left;
if(arb[2*node+1].right==right-middle)
arb[node].right+=arb[2*node].right;
}
int main()
{
int n,t,q,l;
fin>>n>>t;
build_arbint(1,1,n);
for(q=1;q<=t;q++){
fin>>op;
if(op==1){
fin>>x>>l;
y=x+l-1;
update(1,1,n);
}
if(op==2){
fin>>x>>l;
y=x+l-1;
update(1,1,n);
}
if(op==3)
fout<<arb[1].best<<'\n';
}
return 0;
}