Pagini recente » Cod sursa (job #736444) | Cod sursa (job #1351792) | Cod sursa (job #1274874) | Cod sursa (job #2917096) | Cod sursa (job #199714)
Cod sursa(job #199714)
#include<stdio.h>
#define N 1<<18
struct stare{ long pc;long uc;long ls;long ld;long li;long lm;long s;};
stare x[N];
long n,p,cod,a,b;
void init ();
void citire();
void init(long nod,long pp,long uu);
void ocupa(long nod);
void elibereaza(long nod);
void remake(long nod);
int main()
{ citire();
init(1,1,n);
for (;p;p--)
{ scanf("%ld",&cod);
if(cod==3){printf("%ld\n",x[1].lm);continue;}
scanf("%ld%ld",&a,&b);
b+=a-1;
if(cod==1)ocupa(1);
else elibereaza(1);
}
return 0;
}
void citire()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%ld%ld",&n,&p);
}
void init(long nod,long pp,long uu)
{ long fs,fd,mm;
mm=(pp+uu)>>1;fs=nod<<1;fd=fs+1;
x[nod].pc=pp;x[nod].uc=uu;
x[nod].ls=x[nod].ld=x[nod].lm=uu-pp+1;x[nod].li=0;
if(pp==uu)return;
mm=(pp+uu)>>1;init(fs,pp,mm);init(fd,mm+1,uu);
}
void ocupa(long nod)
{ long fs,fd;
fs=nod<<1;fd=fs+1;
if(a<=x[nod].pc&&x[nod].uc<=b)
{ x[nod].ls=x[nod].ld=x[nod].li=x[nod].lm=0;x[nod].s=1;
if(x[nod].pc==x[nod].uc)return;
ocupa(fs);ocupa(fd);return;}
if(a>x[nod].uc)return;
if(b<x[nod].pc)return;
ocupa(fs);
ocupa(fd);
remake(nod);
}
void elibereaza(long nod)
{ long fs,fd;
fs=nod<<1;fd=fs+1;
if(a<=x[nod].pc&&x[nod].uc<=b)
{ x[nod].ls=x[nod].ld=x[nod].lm=x[nod].uc-x[nod].pc+1;
x[nod].li=x[nod].s=0;
if(x[nod].pc==x[nod].uc)return;
elibereaza(fs);elibereaza(fd);return;
}
if(a>x[nod].uc)return;
if(b<x[nod].pc)return;
elibereaza(fs);
elibereaza(fd);
remake(nod);
}
void remake(long nod)
{
long fs,fd,ss,sd;
fs=nod<<1;fd=fs+1;ss=x[fs].s;sd=x[fd].s;
x[nod].s=(ss==sd)?ss:2;
x[nod].ls=(ss)?x[fs].ls:x[fs].ls+x[fd].ls;
x[nod].ld=(sd)?x[fd].ld:x[fs].ld+x[fd].ld;
x[nod].li=(x[fs].li>x[fd].li)?x[fs].li:x[fd].li;
if(ss+sd==4)
if(x[nod].li<x[fs].ld+x[fd].ls)
x[nod].li=x[fs].ld+x[fd].ls;
x[nod].lm=(x[nod].ls>x[nod].ld)?x[nod].ls:x[nod].ld;
x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
}