Pagini recente » Cod sursa (job #2705447) | Cod sursa (job #2064711) | Cod sursa (job #3182330) | Clasament 12345678901 | Cod sursa (job #134954)
Cod sursa(job #134954)
#include <stdio.h>
#define NMAX (1<<17)
int A[2*NMAX], B[2*NMAX], C[2*NMAX], T[2*NMAX];
int N, M, P, Q, D;
void update(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] = q-p+1;
T[nod] = 1;
return;
}
if (p>=q) return;
if (!C[nod])
T[nod] = T[l] = T[l+1] = C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
if (T[nod])
{
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
A[nod] = (A[l]>A[nod])?A[l]:A[nod];
B[nod] = (B[l+1]>B[nod])?B[l+1]:B[nod];
x = (md-p+1+A[l+1])*T[l];
A[nod] = (x>A[nod])?x:A[nod];
x = (B[l]+q-md)*T[l+1];
B[nod] = (x>B[nod])?x:B[nod];
C[nod] = (C[l]>C[nod])?C[l]:C[nod];
C[nod] = (C[l+1]>C[nod])?C[l+1]:C[nod];
x = A[l+1]+B[l];
C[nod] = (x>C[nod])?x:C[nod];
T[nod] = T[l]&T[l+1];
}
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])
T[nod] = T[l] = T[l+1] = C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
if (T[nod])
{
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]; B[nod] = B[l+1]; C[nod] = C[l]; T[nod] = 0;
x = (md-p+1+A[l+1])*T[l];
A[nod] = (x>A[nod])?x:A[nod];
x = (B[l]+q-md)*T[l+1];
B[nod] = (x>B[nod])?x:B[nod];
C[nod] = (C[l+1]>C[nod])?C[l+1]:C[nod];
x = A[l+1]+B[l];
C[nod] = (x>C[nod])?x:C[nod];
T[nod] = T[l]&T[l+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;
update(0,NMAX-1,1);
}
else
printf("%d\n", C[1]);
}
return 0;
}