Pagini recente » Cod sursa (job #1231499) | Cod sursa (job #53786) | Cod sursa (job #592791) | Cod sursa (job #897511) | Cod sursa (job #1157135)
#include <fstream>
#include <string.h>
using namespace std;
const int Nmax = (1 << 18) + 5;
int S[Nmax], L[Nmax], R[Nmax];
inline int max(int x, int y) { return x > y ? x : y; }
void update(int nod, int st, int dr, int a, int b, int val)
{
if (a <= st && dr <= b)
{
S[nod] = L[nod] = R[nod] = val * (dr-st+1);
return;
}
int mid = (st + dr)/2;
if (S[nod] == dr-st+1)
{
S[2*nod] = L[2*nod] = R[2*nod] = mid - st + 1;
S[2*nod+1] = L[2*nod+1] = R[2*nod+1] = dr - mid;
}
else if (S[nod] == 0)
{
S[2*nod] = L[2*nod] = R[2*nod] = 0;
S[2*nod+1] = L[2*nod+1] = R[2*nod+1] = 0;
}
if (a <= mid) update(2*nod, st, mid, a, b, val);
if (mid < b) update(2*nod+1, mid+1, dr, a, b, val);
L[nod] = L[2*nod];
R[nod] = R[2*nod + 1];
if (L[2*nod] == mid - st + 1) L[nod] += L[2*nod + 1];
if (R[2*nod+1] == dr - mid) R[nod] += R[2*nod];
S[nod] = max(S[2*nod], S[2*nod+1]);
S[nod] = max(S[nod], R[2*nod] + L[2*nod+1]);
return;
}
int main()
{
ifstream f ("hotel.in");
ofstream g ("hotel.out");
int N, P, q, i, M;
f >> N >> P;
update (1, 1, N, 1, N, 1); // toate libere
while(P--)
{
f >> q;
if (q == 3)
g << S[1] << '\n';
else {
f >> i >> M;
if (q == 1)
update(1, 1, N, i, i+M-1, 0); // camere ocupate
else if (q == 2)
update(1, 1, N, i, i+M-1, 1); // camere lbere
}
}
return 0;
}