Pagini recente » Cod sursa (job #1565201) | Cod sursa (job #2215427) | Cod sursa (job #2717738) | Cod sursa (job #1676914) | Cod sursa (job #163063)
Cod sursa(job #163063)
#include <fstream>
using namespace std;
const int MAX_TREE = 262144;
int N;
int S[MAX_TREE], L[MAX_TREE], R[MAX_TREE];
void build(int n, int lo, int hi)
{
S[n] = L[n] = R[n] = hi - lo + 1;
if(lo == hi)
return;
build(2 * n, lo, (lo + hi) / 2);
build(2 * n + 1, (lo + hi) / 2 + 1, hi);
}
void update(int n, int lo, int hi, const int &A, const int &B, const bool &type)
{
if(A <= lo && hi <= B)
{
if(!type)
S[n] = L[n] = R[n] = hi - lo + 1;
else
S[n] = L[n] = R[n] = 0;
return;
}
if(!type)
if(S[n] == 0)
{
S[2 * n] = L[2 *n] = R[2 * n] = 0;
S[2 * n + 1] = L[2 * n + 1] = R[2 * n + 1] = 0;
}
else
if(S[n] == hi - lo + 1)
{
S[2 * n] = L[2 *n] = R[2 * n] = (lo + hi) / 2 - lo + 1;
S[2 * n + 1] = L[2 * n + 1] = R[2 * n + 1] = hi - (lo + hi) / 2;
}
if(A <= (lo + hi) / 2)
update(2 * n, lo, (lo + hi) / 2, A, B, type);
if(B > (lo + hi) / 2)
update(2 * n + 1, (lo + hi) / 2 + 1, hi, A, B, type);
S[n] = max(max(S[2 * n], S[2 * n + 1]), R[2 * n] + L[2 * n + 1]);
L[n] = L[2 * n];
if(L[2 * n] == (lo + hi) / 2 - lo + 1)
L[n] += L[2 * n + 1];
R[n] = R[2 * n + 1];
if(R[2 * n + 1] == hi - (lo + hi) / 2)
R[n] += R[2 * n];
}
int main()
{
ifstream in("hotel.in");
ofstream out("hotel.out");
int P, op, v1, v2;
in >> N >> P;
build(1, 1, N);
for(int i = 0; i < P; ++i)
{
in >> op;
switch(op)
{
case 1:
in >> v1 >> v2;
update(1, 1, N, v1, v1 + v2 - 1, true);
break;
case 2:
in >> v1 >> v2;
update(1, 1, N, v1, v1 + v2 - 1, false);
break;
default:
out << S[1] << "\n";
}
}
return 0;
}