Pagini recente » Cod sursa (job #311707) | Cod sursa (job #932537) | Cod sursa (job #799321) | Cod sursa (job #2194673) | Cod sursa (job #1204273)
#include <fstream>
#include <iostream>
using namespace std;
struct nod
{
int inc,sf,tot,timp,tip;
} adi[400005];
int n,p,x,y,z,i,asd;
void ocupa(int st,int dr,int nod)
{
if(x<=st && dr<=y)
{
adi[nod].inc=0;
adi[nod].sf=0;
adi[nod].tot=0;
adi[nod].timp=i;
adi[nod].tip=1;
}else
{
int m=(st+dr)/2;
if (adi[nod*2+1].timp<adi[nod].timp)
{
if (adi[nod].tip==1) { adi[nod*2+1]=adi[nod]; }
else
{
adi[nod*2+1].inc=dr-m;
adi[nod*2+1].sf=dr-m;
adi[nod*2+1].timp=adi[nod].timp;
adi[nod*2+1].tip=2;
adi[nod*2+1].tot=dr-m;
}
}
if (adi[nod*2].timp<adi[nod].timp)
{
if (adi[nod].tip==1) { adi[nod*2]=adi[nod]; }
else
{
adi[nod*2].inc=m-st+1;
adi[nod*2].sf=m-st+1;
adi[nod*2].timp=adi[nod].timp;
adi[nod*2].tip=2;
adi[nod*2].tot=m-st+1;
}
}
if (x<=m)
{
ocupa(st,m,2*nod);
}
if (y>m)
{
ocupa(m+1,dr,2*nod+1);
}
adi[nod].inc=adi[nod*2].inc; if (m-st+1==adi[nod*2].inc) adi[nod].inc+=adi[nod*2+1].inc;
adi[nod].sf=adi[nod*2+1].sf; if (dr-m==adi[nod*2+1].sf) adi[nod].sf+=adi[nod*2].sf;
adi[nod].tot=adi[nod*2].tot; if (adi[nod*2+1].tot>adi[nod].tot) adi[nod].tot=adi[nod*2+1].tot; if (adi[nod*2].sf+adi[nod*2+1].inc>adi[nod].tot) adi[nod].tot=adi[nod*2].sf+adi[nod*2+1].inc;
}
}
void elibereaza(int st,int dr,int nod)
{
if(x<=st && dr<=y)
{
adi[nod].inc=dr-st+1;
adi[nod].sf=dr-st+1;
adi[nod].tot=dr-st+1;
adi[nod].timp=i;
adi[nod].tip=2;
}else
{
int m=(st+dr)/2;
if (adi[nod*2+1].timp<adi[nod].timp)
{
if (adi[nod].tip==1) { adi[nod*2+1]=adi[nod]; }
else
{
adi[nod*2+1].inc=dr-m;
adi[nod*2+1].sf=dr-m;
adi[nod*2+1].timp=adi[nod].timp;
adi[nod*2+1].tip=2;
adi[nod*2+1].tot=dr-m;
}
}
if (adi[nod*2].timp<adi[nod].timp)
{
if (adi[nod].tip==1) { adi[nod*2]=adi[nod]; }
else
{
adi[nod*2].inc=m-st+1;
adi[nod*2].sf=m-st+1;
adi[nod*2].timp=adi[nod].timp;
adi[nod*2].tip=2;
adi[nod*2].tot=m-st+1;
}
}
if (x<=m)
{
elibereaza(st,m,2*nod);
}
if (y>m)
{
elibereaza(m+1,dr,2*nod+1);
}
adi[nod].inc=adi[nod*2].inc; if (m-st+1==adi[nod*2].inc) adi[nod].inc+=adi[nod*2+1].inc;
adi[nod].sf=adi[nod*2+1].sf; if (dr-m==adi[nod*2+1].sf) adi[nod].sf+=adi[nod*2].sf;
adi[nod].tot=adi[nod*2].tot; if (adi[nod*2+1].tot>adi[nod].tot) adi[nod].tot=adi[nod*2+1].tot; if (adi[nod*2].sf+adi[nod*2+1].inc>adi[nod].tot) adi[nod].tot=adi[nod*2].sf+adi[nod*2+1].inc;
}
}
void initiaza(int st,int dr,int nod)
{
adi[nod].inc=dr-st+1;
adi[nod].sf=dr-st+1;
adi[nod].tot=dr-st+1;
adi[nod].tip=2;
adi[nod].timp=0;
if (st!=dr)
{
int m=(st+dr)/2;
initiaza(st,m,nod*2);
initiaza(m+1,dr,nod*2+1);
}
}
int main()
{
ifstream in ("hotel.in");
ofstream out ("hotel.out");
in>>n>>p;
i=0;
initiaza(1,n,1);
for ( i=1;i<=p;++i)
{
in>>x;
if (x==1)
{
in>>x>>z;
y=x+z-1;
ocupa(1,n,1);
}else if (x==2)
{
in>>x>>z;
y=x+z-1;
elibereaza(1,n,1);
}else
{
out<<adi[1].tot<<"\n";
}
}
in.close();
out.close();
return 0;
}