Pagini recente » Cod sursa (job #1856474) | Cod sursa (job #873346) | Cod sursa (job #1031364) | Cod sursa (job #1771668) | Cod sursa (job #936979)
Cod sursa(job #936979)
#include <fstream>
#include <algorithm>
#include <bitset>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
using namespace std;
const int dim = 100005;
int N, M, tip;
int pozs, pozd, lg;
int DM[dim * 4], DS[dim * 4], DD[dim * 4];
bitset <dim * 4> U;
void update_init (int n, int st, int dr)
{
DM[n] = DS[n] = DD[n] = dr - st + 1;
if (st == dr)
return;
int m = (st + dr) >> 1;
int f1 = n << 1;
int f2 = f1 + 1;
update_init (f1, st, m);
update_init (f2, m + 1, dr);
}
void citeste ()
{
scanf ("%d%d", &pozs, &lg);
pozd = pozs + lg - 1;
}
void update (int n, int st, int dr)
{
if (pozs <= st && dr <= pozd)
{
if (tip == 1)
DM[n] = DS[n] = DD[n] = 0;
if (tip == 2)
DM[n] = DS[n] = DD[n] = dr - st + 1;
U[n] = 1;
return;
}
int m = (st + dr) >> 1;
int f1 = n << 1;
int f2 = f1 + 1;
if (U[n])
{
U[n] = 0;
U[f1] = U[f2] = 1;
if (DM[n] == dr - st + 1)
{
DM[f1] = DS[f1] = DD[f1] = m - st + 1;
DM[f2] = DS[f2] = DD[f2] = dr - m;
}
else if (DM[n] == 0)
{
DM[f1] = DS[f1] = DD[f1] = 0;
DM[f2] = DS[f2] = DD[f2] = 0;
}
else
{
//printf ("ERROR\n");
assert (0);
}
}
if (m >= pozs)
update (f1, st, m);
if (m + 1 <= pozd)
update (f2, m + 1, dr);
DM[n] = max (DD[f1] + DS[f2], max (DM[f1], DM[f2]));
DS[n] = DS[f1];
if (DS[f1] == m - st + 1) DS[n] += DS[f2];
DD[n] = DD[f2];
if (DD[f2] == dr - m) DD[n] += DD[f1];
}
int main ()
{
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
scanf ("%d%d", &N, &M);
update_init (1, 1, N);
while (M --)
{
scanf ("%d", &tip);
if (tip == 1)
{
citeste ();
update (1, 1, N);
}
else if (tip == 2)
{
citeste ();
update (1, 1, N);
}
else
{
printf ("%d\n", DM[1]);
}
}
return 0;
}