Nu aveti permisiuni pentru a descarca fisierul grader_test7.ok
Cod sursa(job #3240626)
Utilizator | Data | 18 august 2024 21:28:24 | |
---|---|---|---|
Problema | Hotel | Scor | 10 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 3.41 kb |
#include <fstream>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
const int Nmax = 400005;
struct hotel
{
int maxx, left, right;
bool ocupat;
};
struct Aint
{
hotel aint[Nmax];
void build(int nod, int st, int dr)
{
if (st == dr)
{
aint[nod] = {1, 1, 1, 0};
return;
}
int mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
aint[nod] = {dr - st + 1, dr - st + 1, dr - st + 1, 0};
}
void propaga(int nod, int st, int dr)
{
if (aint[nod].ocupat)
{
int mid = (st + dr) / 2;
if (aint[nod].maxx == 0)
{
aint[2 * nod] = {0, 0, 0, 1};
aint[2 * nod + 1] = {0, 0, 0, 1};
}
else
{
aint[2 * nod] = {mid - st + 1, mid - st + 1, mid - st + 1, 0};
aint[2 * nod + 1] = {dr - mid, dr - mid, dr - mid, 0};
}
aint[nod].ocupat = 0;
}
}
void baga(int nod, int st, int dr, int x, int y)
{
if (x > dr || y < st)
return;
if (x <= st && dr <= y)
{
aint[nod] = {0, 0, 0, 1};
return;
}
propaga(nod, st, dr);
int mid = (st + dr) / 2;
baga(2 * nod, st, mid, x, y);
baga(2 * nod + 1, mid + 1, dr, x, y);
aint[nod].maxx = max(max(aint[2 * nod].maxx, aint[2 * nod + 1].maxx), aint[2 * nod].right + aint[2 * nod + 1].left);
if (aint[2 * nod].left == mid - st + 1)
aint[nod].left = aint[2 * nod].left + aint[2 * nod + 1].left;
else
aint[nod].left = aint[2 * nod].left;
if (aint[2 * nod + 1].right == dr - mid)
aint[nod].right = aint[2 * nod].right + aint[2 * nod + 1].right;
else
aint[nod].right = aint[2 * nod + 1].right;
}
void scoate(int nod, int st, int dr, int x, int y)
{
if (x > dr || y < st)
return;
if (x <= st && dr <= y)
{
aint[nod] = {dr - st + 1, dr - st + 1, dr - st + 1, 0};
return;
}
propaga(nod, st, dr);
int mid = (st + dr) / 2;
scoate(2 * nod, st, mid, x, y);
scoate(2 * nod + 1, mid + 1, dr, x, y);
aint[nod].maxx = max(max(aint[2 * nod].maxx, aint[2 * nod + 1].maxx), aint[2 * nod].right + aint[2 * nod + 1].left);
if (aint[2 * nod].left == mid - st + 1)
aint[nod].left = aint[2 * nod].left + aint[2 * nod + 1].left;
else
aint[nod].left = aint[2 * nod].left;
if (aint[2 * nod + 1].right == dr - mid)
aint[nod].right = aint[2 * nod].right + aint[2 * nod + 1].right;
else
aint[nod].right = aint[2 * nod + 1].right;
}
int query()
{
return aint[1].maxx;
}
} aint;
int main()
{
int n, p, op, x, y;
cin >> n >> p;
aint.build(1, 1, n);
for (int i = 1; i <= p; i++)
{
cin >> op;
if (op == 3)
cout << aint.query() << endl;
else
{
cin >> x >> y;
if (op == 1)
aint.baga(1, 1, n, x, x + y - 1);
else
aint.scoate(1, 1, n, x, x + y - 1);
}
}
return 0;
}