Pagini recente » Cod sursa (job #756386) | Cod sursa (job #38568) | Cod sursa (job #275271) | Cod sursa (job #1175406) | Cod sursa (job #2681164)
#include <fstream>
#include <algorithm>
using namespace std;
struct camera {
int prefix, sufix, maxx;
};
int n, p;
camera ai[500001];
ifstream cin("hotel.in");
ofstream cout("hotel.out");
void build(int nod, int x, int y)
{
if (x != y)
{
int mij = (x + y) / 2;
build(2 * nod, x, mij);
build(2 * nod + 1, mij + 1, y);
}
ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = y - x + 1;
}
void update(int nod, int x, int y, int a, int b, int val)
{
if (x >= a && y <= b)
{
if (val == 1)
ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = 0;
else
ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = y - x + 1;
}
else
{
int mij = (x + y) / 2;
if (ai[nod].maxx == 0)
{
ai[2 * nod] = { 0,0,0 };
ai[2 * nod + 1] = { 0,0,0 };
}
else if (ai[nod].maxx == y - x + 1)
{
ai[2*nod].prefix = ai[2*nod].sufix = ai[2*nod].maxx = mij - x + 1;
ai[2*nod+1].prefix = ai[2*nod+1].sufix = ai[2*nod+1].maxx = y - mij;
}
if (a <= mij)
update(2 * nod, x, mij, a, b, val);
if (b > mij)
update(2 * nod + 1, mij + 1, y, a, b, val);
ai[nod].maxx = max({ ai[2 * nod].maxx, ai[2 * nod + 1].maxx , ai[2 * nod].sufix + ai[2 * nod + 1].prefix });
ai[nod].prefix = ai[2 * nod].prefix;
if (ai[nod].prefix == mij - x + 1) ai[nod].prefix += ai[2 * nod + 1].prefix;
ai[nod].sufix = ai[2 * nod + 1].sufix;
if (ai[nod].sufix == y - mij) ai[nod].sufix += ai[2 * nod].sufix;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin >> n >> p;
int x, a, b;
build(1, 1, n);
for (int i = 1; i <= p; i++)
{
cin >> x;
if (x == 3)
{
cout << ai[1].maxx << '\n';
}
else
{
cin >> a >> b;
update(1, 1, n, a, a + b - 1, x);
}
}
return 0;
}