Pagini recente » Cod sursa (job #1092538) | Cod sursa (job #2543518) | Cod sursa (job #168560) | Cod sursa (job #308146) | Cod sursa (job #1759908)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct segmentTree{
int current;
int left_INT;
int right_INT;
}AINT[5 * 100010];
int N, M, i, question, P;
void build(int node, int left, int right)
{
if(left == right)
{
AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = 1;
return;
}
int middle = (left + right) >> 1;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = AINT[2 * node].current + AINT[2 * node + 1].current;
}
void update(int node, int left, int right, int A, int B, int value)
{
if(left >= A && right <= B)
{
if(value == 1)
{
AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = 0;
}
else
{
AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = right - left + 1;
}
return;
}
int middle = (left + right) >> 1;
if(AINT[node].current == 0)
{
AINT[2 * node].current = AINT[2 * node].left_INT = AINT[2 * node].right_INT = 0;
AINT[2 * node + 1].current = AINT[2 * node + 1].left_INT = AINT[2 * node + 1].right_INT = 0;
}
if(AINT[node].current == right - left + 1)
{
AINT[2 * node].current = AINT[2 * node].left_INT = AINT[2 * node].right_INT = middle - left + 1;
AINT[2 * node + 1].current = AINT[2 * node + 1].left_INT = AINT[2 * node + 1].right_INT = right - middle;
}
if(A <= middle)
{
update(2 * node, left, middle, A, B, value);
}
if(B > middle)
{
update(2 * node + 1, middle + 1, right, A, B, value);
}
AINT[node].current = max( max(AINT[2 * node].current, AINT[2 * node + 1].current), AINT[2 * node].right_INT + AINT[2 * node + 1].left_INT );
AINT[node].left_INT = AINT[2 * node].left_INT;
AINT[node].right_INT = AINT[2 * node + 1].right_INT;
if(AINT[2 * node].left_INT == middle - left + 1)
{
AINT[node].left_INT += AINT[2 * node + 1].left_INT;
}
if(AINT[2 * node + 1].right_INT == right - middle)
{
AINT[node].right_INT += AINT[2 * node].right_INT;
}
}
int main()
{
fin >> N >> P;
build(1, 1, N);
while(P --)
{
fin >> question;
if(question == 1)
{
fin >> i >> M;
update(1, 1, N, i, i + M - 1, 1); // 1 = ocupat;
continue;
}
if(question == 2)
{
fin >> i >> M;
update(1, 1, N, i, i + M - 1, 0); // 0 = liber;
continue;
}
fout << AINT[1].current << '\n';
}
return 0;
}