Pagini recente » Cod sursa (job #2293360) | Cod sursa (job #1671871) | Cod sursa (job #2329927) | Cod sursa (job #2718241) | Cod sursa (job #1365051)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int Nmax = 100005;
const int tree_size = 1 << 18;
struct node {
int max_total;
int max_st, max_dr;
};
int n, p;
node tree[tree_size];
int lazy[tree_size];
int a, b, result, value;
void update_node(int node, int l, int r) {
if (lazy[node]) {
if (lazy[node] == 1)
tree[node].max_st = tree[node].max_dr =
tree[node].max_total = 0;
else
tree[node].max_st = tree[node].max_dr =
tree[node].max_total = (r - l + 1);
if (r != l) {
lazy[node << 1] = lazy[node];
lazy[(node << 1) + 1] = lazy[node];
}
lazy[node] = 0;
}
}
void combine_node(int node, int l, int r){
int left = node << 1;
int right = (node << 1) + 1;
int m = (l + r) >> 1;
tree[node].max_st = tree[left].max_st;
tree[node].max_dr = tree[right].max_dr;
if (tree[left].max_st == (m - l + 1))
tree[node].max_st += tree[right].max_st;
if (tree[right].max_dr == (r - m))
tree[node].max_dr += tree[left].max_dr;
tree[node].max_total = tree[left].max_dr + tree[right].max_st;
tree[node].max_total = max(tree[node].max_total, tree[node].max_st);
tree[node].max_total = max(tree[node].max_total, tree[node].max_dr);
tree[node].max_total = max(tree[node].max_total, tree[left].max_total);
tree[node].max_total = max(tree[node].max_total, tree[right].max_total);
}
void update_tree(int node, int l, int r) {
// lazy[node] == 1, make interval full
// lazy[node] == -1, make interval vacant
update_node(node, l, r);
if (b < l || r < a)
return;
if (a <= l && r <= b) {
if (value == 1)
tree[node].max_st = tree[node].max_dr =
tree[node].max_total = 0;
else
tree[node].max_st = tree[node].max_dr =
tree[node].max_total = (r - l + 1);
if (r != l) {
lazy[node << 1] += value;
lazy[(node << 1) + 1] += value;
}
}
else {
int m = (l + r) >> 1;
update_tree(node << 1, l, m);
update_tree((node << 1) + 1, m + 1, r);
combine_node(node, l, r);
}
}
void construct_tree(int node, int l, int r) {
if (l == r)
tree[node].max_st = tree[node].max_dr = tree[node].max_total = 1;
else {
int m = (l + r) >> 1;
construct_tree(node << 1, l, m);
construct_tree((node << 1) + 1, m + 1, r);
combine_node(node, l, r);
}
}
int main() {
int c, x;
in >> n >> p;
construct_tree(1, 1, n);
for (int i = 1; i <= p; ++i) {
in >> c;
if (c == 1) {
in >> a >> x;
b = a + x - 1;
value = 1;
update_tree(1, 1, n);
}
else if (c == 2) {
in >> a >> x;
b = a + x - 1;
value = -2;
update_tree(1, 1, n);
}
else {
out << tree[1].max_total << '\n';
}
}
}