Pagini recente » Cod sursa (job #3122635) | Cod sursa (job #1904100) | Cod sursa (job #6907) | Cod sursa (job #2722365) | Cod sursa (job #220534)
Cod sursa(job #220534)
//note: probabil m-am complicat pe undeva si in mod cert am niste greseli urate
// if you care about your brain do not try to understand what i wrote below
// even i don't understand it!... or do i?!
#include <stdio.h>
#define MAXN 100005
struct unknown
{
int v,s,e,l,r,t;
};
unknown v[4*MAXN];
int n,P,a,S,E;
inline int max(int x, int y)
{
if (x>y)
return x;
return y;
}
inline void citire()
{
scanf("%d%d",&n,&P);
}
inline void update1(int p)
{
if (v[p].t==2 )
{
int K=v[p].e-v[p].s+1;
v[p].v=K; v[p].l=K; v[p].r=K;
if (p<<1 <= 4*n )
v[(p<<1)+1].t=v[p].t;
if (p<<1 <= 4*n )
v[(p<<1)].t=v[p].t;
v[p].t=0;
}
if (v[p].t==1)
{
v[p].v=0; v[p].l=0; v[p].r=0;
if (p<<1 <= 4*n )
v[(p<<1)+1].t=v[p].t;
if (p<<1 <= 4*n )
v[(p<<1)].t=v[p].t;
v[p].t=0;
}
if ( v[p].s == v[p].e )
{
v[p].v=0; v[p].l=0; v[p].r=0; v[p].t=1;
return;
}
if (v[p<<1].e>=S) update1(p<<1);
if (v[(p<<1)+1].s<=E) update1( (p<<1) +1);
v[p].l=v[p<<1].l;
if (v[p<<1].l == v[p<<1].e-v[p<<1].s+1 )
v[p].l+=v[(p<<1)+1].l;
v[p].r=v[(p<<1)+1].r;
if (v[(p<<1)+1].r == v[(p<<1)+1].e-v[(p<<1)+1].s+1 )
v[p].r+=v[(p<<1)].r;
v[p].v=max(v[(p<<1)+1].v,v[(p<<1)].v);
v[p].v=max(v[p].v,v[(p<<1)+1].l+v[p<<1].r);
v[p].v=max(v[p].v,v[p].l);
v[p].v=max(v[p].v,v[p].r);
}
inline void update2(int p)
{
if (v[p].t==2)
{
int K=v[p].e-v[p].s+1;
v[p].v=K; v[p].l=K; v[p].r=K;
if (p<<1 <= 4*n )
v[(p<<1)+1].t=v[p].t;
if (p<<1 <= 4*n )
v[(p<<1)].t=v[p].t;
v[p].t=0;
}
if (v[p].t==1)
{
v[p].v=0; v[p].l=0; v[p].r=0;
if (p<<1 <= 4*n )
v[(p<<1)+1].t=v[p].t;
if (p<<1 <= 4*n )
v[(p<<1)].t=v[p].t;
v[p].t=0;
}
if ( v[p].s == v[p].e)
{
v[p].v=v[p].e-v[p].s+1; v[p].l=v[p].e-v[p].s+1; v[p].r=v[p].e-v[p].s+1; v[p].t=2;
return;
}
if (v[(p<<1)].e>=S) update2(p<<1);
if (v[(p<<1)+1].s<=E) update2( (p<<1) +1);
v[p].l=v[p<<1].l;
if (v[p<<1].l == v[p<<1].e-v[p<<1].s+1 )
v[p].l+=v[(p<<1)+1].l;
v[p].r=v[(p<<1)+1].r;
if (v[(p<<1)+1].r == v[(p<<1)+1].e-v[(p<<1)+1].s+1 )
v[p].r+=v[(p<<1)].r;
v[p].v=max(v[(p<<1)+1].v,v[(p<<1)].v);
v[p].v=max(v[p].v,v[(p<<1)+1].l+v[p<<1].r);
v[p].v=max(v[p].v,v[p].l);
v[p].v=max(v[p].v,v[p].r);
}
void buildarb(int i)
{
if (i%2==0)
{
v[i].s = v[ i>>1 ].s;
v[i].e = ( v[ i>>1 ].s + v[ i>>1 ].e -1)/2 + ( v[ i>>1 ].s + v[ i>>1 ].e -1)%2;
v[i].l = v[i].e - v[i].s +1;
v[i].r = v[i].l;
v[i].v = v[i].l;
}
else
{
v[i].s = ( v[ i>>1 ].s + v[ i>>1 ].e -1)/2 + ( v[ i>>1 ].s + v[ i>>1 ].e -1)%2 + 1;
v[i].e = v[ i>>1 ].e;
v[i].l = v[i].e - v[i].s +1;
v[i].r = v[i].l;
v[i].v = v[i].l;
}
if (v[i].s==v[i].e)
return;
buildarb(i<<1);
buildarb((i<<1)+1);
}
void rezolv()
{
int i;
v[1].s=1; v[1].e=n; v[1].l=n; v[1].r=n; v[1].v=n;
buildarb(2);
buildarb(3);
for (i=0; i<P; ++i)
{
scanf("%d",&a);
// stuffs
if (a==3)
printf("%d\n",v[1].v);
if (a==2) // pleaca turisti
{
scanf("%d%d",&S,&E);
E=S+E-1;
update2(1);
}
if (a==1) // sosec turisti
{
scanf("%d%d",&S,&E);
E=S+E-1;
update1(1);
}
}
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
citire();
rezolv();
fclose(stdin);
fclose(stdout);
return 0;
}