Pagini recente » Cod sursa (job #2471248) | Istoria paginii runda/tarni_und_veli/clasament | Cod sursa (job #2448396) | Cod sursa (job #2258730) | Cod sursa (job #134945)
Cod sursa(job #134945)
#include <stdio.h>
#define NMAX (1<<17)
#define MIN(a,b) (((a)<(b))?(a):(b))
#define INF 1666000666
int A[2*NMAX], B[2*NMAX], C[2*NMAX], T[2*NMAX];
int N, M, P, Q, D;
void update2(int p, int q, int nod)
{
int md = (p+q)>>1, l = nod<<1, x;
if (P<=p&&q<=Q)
{
A[nod] = B[nod] = C[nod] = T[nod] = 0;
return;
}
if (p>=q) return;
if (C[nod]==0)
{
T[nod] = T[l] = T[l+1] = 0;
C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
}
if (T[nod]==1)
{
T[l] = T[l+1] = 1;
A[l] = B[l] = C[l] = q-md;
if (md<N) A[l+1] = B[l+1] = C[l+1] = q-md;
}
if ( (p <= P && P <= q) || (p <= Q && Q <= q) )
{
update2(p, md, l);
update2(md+1, q, l+1);
}
//recompute stuff
A[nod] = A[l];
if ((T[l])&&(A[nod]<(md-p+1+A[l+1]))) A[nod] = md-p+1+A[l+1];
B[nod] = B[l+1];
if ((T[l+1])&&(B[nod]<(B[l]+q-md))) B[nod] = B[l]+q-md;
C[nod] = C[l];
if (C[nod]<C[l+1]) C[nod] = C[l+1];
if (C[nod]<(B[l]+A[l+1])) C[nod] = A[l+1]+B[l];
T[nod] = 0;
if ((T[l]==T[l+1])&&(T[l])) T[nod] = 1;
}
void update(int p, int q, int nod)
{
int md = (p+q)>>1, l = nod<<1;
if (P<=p&&q<=Q)
{
A[nod] = B[nod] = C[nod] = q-p+1;
T[nod] = 1;
return;
}
if (p>=q) return;
if (C[nod]==0)
{
T[nod] = T[l] = T[l+1] = 0;
C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
}
if (T[nod]==1)
{
T[l] = T[l+1] = 1;
A[l] = B[l] = C[l] = q-md;
if (md<N) A[l+1] = B[l+1] = C[l+1] = q-md;
}
if ( (p <= P && P <= q) || (p <= Q && Q <= q) )
{
update(p, md, l);
update(md+1, q, l+1);
}
//recompute stuff
if (A[nod]<A[l]) A[nod] = A[l];
if ((T[l])&&(A[nod]<(md-p+1+A[l+1]))) A[nod] = md-p+1+A[l+1];
if (B[nod]<B[l+1]) B[nod] = B[l+1];
if ((T[l+1])&&(B[nod]<(B[l]+q-md))) B[nod] = B[l]+q-md;
if (C[nod]<C[l]) C[nod] = C[l];
if (C[nod]<C[l+1]) C[nod] = C[l+1];
if (C[nod]<(B[l]+A[l+1])) C[nod] = A[l+1]+B[l];
if ((T[l]==T[l+1])&&(T[l])) T[nod] = 1;
}
int main()
{
int i, t;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d %d", &N, &M);
P = 0; Q = N-1;
update(0,NMAX-1,1);
for (i = 0; i < M; i++)
{
scanf("%d", &t);
if (t==1)
{
scanf("%d%d", &P, &D);
P--;
Q = P+D-1;
update2(0,NMAX-1,1);
}
else
if (t==2)
{
scanf("%d%d", &P, &D);
P--;
Q = P+D-1;
if (Q>=N) Q = N-1;
update(0,NMAX-1,1);
}
else
printf("%d\n", C[1]);
}
return 0;
}