Pagini recente » Cod sursa (job #2634138) | Cod sursa (job #113520) | Cod sursa (job #2543814) | Cod sursa (job #1665251) | Cod sursa (job #1425883)
#include <fstream>
#include <algorithm>
using namespace std;
fstream fin("hotel.in", ios::in);
fstream fout("hotel.out", ios::out);
struct tree
{
int l, max, r;
};
#define MAXN 100000
int N, M, P, val, a, b;
tree T[4 * MAXN + 10];
inline int max_node_val(int left_val, int right_val)
{
if (left_val == -1 && right_val == -1) return -1;
return (left_val == -1 ? 0 : left_val) + (right_val == -1 ? 0 : right_val);
}
inline void get_max(int node, int left, int right)
{
bool l_exc, r_exc;
int mid = (left + right) / 2;
int left_max = !T[node * 2].max ? mid - left + 1 : T[node * 2].max,
left_l = !T[node * 2].l ? left_max : T[node * 2].l,
left_r = !T[node * 2].r ? left_max : T[node * 2].r,
right_max = !T[node * 2 + 1].max ? right - mid : T[node * 2 + 1].max,
right_l = !T[node * 2 + 1].l ? right_max : T[node * 2 + 1].l,
right_r = !T[node * 2 + 1].r ? right_max : T[node * 2 + 1].r;
l_exc = left_l == mid - left + 1, r_exc = right_r == right - mid;
T[node].l = l_exc ? left_l + (right_l == -1 ? 0 : right_l) : left_l;
T[node].r = r_exc ? right_r + (left_r == -1 ? 0 : left_r) : right_r;
T[node].max = max(max(T[node].l, T[node].r), max_node_val(left_r, right_l));
}
void update(int node, int left, int right)
{
if (left == right){
T[node].max = T[node].l = T[node].r = val;
return;
}
int mid = (left + right) / 2;
if (a <= mid) update(node * 2, left, mid);
if (b >= mid + 1) update(node * 2 + 1, mid + 1, right);
get_max(node, left, right);
}
int main()
{
fin >> N >> P;
for (int i = 1, x; i <= P; i++){
fin >> x;
if (x == 1)
fin >> a >> b, b = a + b - 1,
val = -1,
update(1, 1, N);
else if (x == 2)
fin >> a >> b, b = a + b - 1,
val = 1,
update(1, 1, N);
else {
int max_room = !T[1].max ? N : T[1].max;
fout << max_room << "\n";
}
}
fout.close();
fin.close();
return 0;
}