Pagini recente » Cod sursa (job #2508963) | Cod sursa (job #1973734) | Cod sursa (job #2907889) | Cod sursa (job #1897138) | Cod sursa (job #1473197)
#include<cstdio>
#define DIM (2 << 17)
using namespace std;
struct{int x, y, z;} arb[DIM];
int N, M, T, Val, start, finish, i;
int Maxim(int a, int b)
{
return a > b ? a : b;
}
void Update(int, int, int);
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d", &N, &M);
start = 1, finish = N;
T = 2;
Update(1, 1, N);
for ( ; M; M--)
{
scanf("%d", &T);
if (T == 3)
printf("%d\n", arb[1].z);
else
{
if (T == 1)
{
scanf("%d%d", &start, &finish);
finish += start - 1;
Update(1, 1, N);
}
else
{
scanf("%d%d", &start, &finish);
finish = finish + start - 1;
Update(1, 1, N);
}
/*for (i = 1; i <= N * 2 + 5; i++)
printf("%d ", arb[i].x);
printf("\n");
for (i = 1; i <= N * 2 + 5; i++)
printf("%d ", arb[i].y);
printf("\n");
for (i = 1; i <= N * 2 + 5; i++)
printf("%d ", arb[i].z);
printf("\n\n");*/
}
}
}
void Update(int nod, int left, int right)
{
if (left > finish || right < start || left > right)
return;
if (start <= left && right <= finish)
{
if (T == 1)
arb[nod].x = arb[nod].y = arb[nod].z = 0;
else
arb[nod].x = arb[nod].y = arb[nod].z = right - left + 1;
return;
}
int div = (left + right)/2;
if (arb[nod].z == 0)
{
arb[2 * nod].x = arb[2 * nod].y = arb[2 * nod].z = 0;
arb[2 * nod + 1].x = arb[2 * nod + 1].y = arb[2 * nod + 1].z = 0;
}
else
if (arb[nod].z == right - left + 1)
{
arb[2 * nod].x = arb[2 * nod].y = arb[2 * nod].z = div - left + 1;
arb[2 * nod + 1].x = arb[2 * nod + 1].y = arb[2 * nod + 1].z = right - div;
}
Update(2 * nod, left, div);
Update(2 * nod + 1, div + 1, right);
arb[nod].x = arb[nod * 2].x;
if (arb[nod * 2].y == div - left + 1)
arb[nod].x += arb[nod * 2 + 1].x;
arb[nod].y = arb[nod * 2 + 1].y;
if (arb[2 * nod + 1].x == right - div)
arb[nod].y += arb[2 * nod].y;
arb[nod].z = Maxim(Maxim(arb[nod * 2 + 1].z, arb[nod * 2].z), arb[2 * nod].y + arb[2 * nod + 1].x);
}