Pagini recente » Cod sursa (job #34913) | Cod sursa (job #175782) | Cod sursa (job #1883272) | Cod sursa (job #266595) | Cod sursa (job #331907)
Cod sursa(job #331907)
#include<stdio.h>
#define N 100010
struct hotel
{
int st,best,dr;
};
int n,pr,ul;
bool vin;
hotel t[N<<2];
void init(int p,int u,int poz)
{
if(p>u)
return;
t[poz].st=t[poz].best=t[poz].dr=u-p+1;
if(p==u)
return;
init(p,(p+u)>>1,poz<<1);
init(((p+u)>>1)+1,u,(poz<<1)+1);
}
inline int max(int x,int y,int z)
{
if(x<y)
x=y;
if(x<z)
x=z;
return x;
}
void update(int p,int u,int poz)
{
if(p>u)
return;
if(pr<=p && u<=ul)
{
if(vin)
t[poz].st=t[poz].best=t[poz].dr=0;
else
t[poz].st=t[poz].best=t[poz].dr=u-p+1;
return;
}
int mij=(p+u)>>1;
if(t[poz].best==0)
{
t[poz<<1].st=t[poz<<1].best=t[poz<<1].dr=0;
t[(poz<<1)+1].st=t[(poz<<1)+1].best=t[(poz<<1)+1].dr=0;
}
if(t[poz].best==u-p+1)
{
t[poz<<1].st=t[poz<<1].best=t[poz<<1].dr=mij-p+1;
t[(poz<<1)+1].st=t[(poz<<1)+1].best=t[(poz<<1)+1].dr=u-mij;
}
if(pr<=mij)
update(p,mij,poz<<1);
if(mij<ul)
update(mij+1,u,(poz<<1)+1);
if(t[poz<<1].st==mij-p+1)
t[poz].st=t[poz<<1].st+t[(poz<<1)+1].st;
else
t[poz].st=t[poz<<1].st;
if(t[(poz<<1)+1].dr==u-mij)
t[poz].dr=t[poz<<1].dr+t[(poz<<1)+1].dr;
else
t[poz].dr=t[(poz<<1)+1].dr;
t[poz].best=max(t[poz<<1].best,t[(poz<<1)+1].best,t[poz<<1].dr+t[(poz<<1)+1].st);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int p;
scanf("%d%d",&n,&p);
init(1,n,1);
for(; p; --p)
{
int cod,x,y;
scanf("%d",&cod);
if(cod==1)
{
scanf("%d%d",&x,&y);
vin=true;
pr=x;
ul=x+y-1;
update(1,n,1);
continue;
}
if(cod==2)
{
scanf("%d%d",&x,&y);
vin=false;
pr=x;
ul=x+y-1;
update(1,n,1);
continue;
}
printf("%d\n",t[1].best);
}
return 0;
}