Pagini recente » Cod sursa (job #565327) | Cod sursa (job #2781510) | Cod sursa (job #2172626) | Cod sursa (job #70699) | Cod sursa (job #733447)
Cod sursa(job #733447)
#include <cstdio>
#include <cassert>
#define TREE_SIZE 262145
int n, p, crt[TREE_SIZE], beg[TREE_SIZE], end[TREE_SIZE];
int st, dr, act;
inline int max(int a, int b)
{
return (a > b ? a : b);
}
inline int max(int a, int b, int c)
{
if (a > b)
return max(a, c);
return max(b, c);
}
void build(int node, int left, int right);
void update(int node, int left, int right);
int main()
{
assert(freopen("hotel.in", "r", stdin));
assert(freopen("hotel.out","w",stdout));
assert(scanf("%d %d", &n, &p));
build(1, 1, n);
for (int i = 1 ; i <= p ; ++i)
{
scanf("%d", &act);
if (act == 1 || act == 2)
{
scanf("%d %d", &st, &dr);
dr = st + dr - 1;
update(1, 1, n);
}
else
printf("%d\n", crt[1]);
}
return 0;
}
void build(int node, int left, int right)
{
crt[node] = beg[node] = end[node] = right - left + 1;
if (left != right)
{
int midp = (left + right) >> 1;
build(node << 1, left, midp);
build((node << 1) + 1, midp + 1, right);
}
}
void update(int node, int left, int right)
{
if (st <= left && right <= dr)
{
int value = 0;
if (act == 2)
value = right - left + 1;
crt[node] = beg[node] = end[node] = value;
return;
}
int midp = (left + right) >> 1;
if (crt[node] == right - left + 1)
{
crt[node << 1] = beg[node << 1] = end[node << 1] = midp - left + 1;
crt[(node << 1) + 1] = beg[(node << 1) + 1] = end[(node << 1) + 1] = right - midp;
}
else if (crt[node] == 0)
{
crt[node << 1] = beg[node << 1] = end[node << 1] = 0;
crt[(node << 1) + 1] = beg[(node << 1) + 1] = end[(node << 1) + 1] = 0;
}
if (st <= midp)
update(node << 1, left, midp);
if (dr > midp)
update((node << 1) + 1, midp + 1, right);
crt[node] = max(crt[node << 1], crt[(node << 1) + 1], end[node << 1] + beg[(node << 1) + 1]);
beg[node] = beg[node << 1];
if (beg[node] == midp - left + 1)
beg[node] += beg[(node << 1) + 1];
end[node] = end[(node << 1) + 1];
if (end[node] == right - midp)
end[node] += end[node << 1];
}