Pagini recente » Cod sursa (job #38561) | Cod sursa (job #2072019) | Cod sursa (job #587156) | Cod sursa (job #2285125) | Cod sursa (job #3151238)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct node
{
int stLibere, drLibere, totalLibere;
};
const int N = 100005;
int n, q;
node arb[4 * N];
int lazy[4 * N];
int max(int a, int b, int c)
{
return max(max(a, b), c);
}
void updateNode(int ti, int tl, int tr)
{
arb[ti].totalLibere = max(arb[ti * 2].totalLibere, arb[ti * 2 + 1].totalLibere, arb[ti * 2].drLibere + arb[ti * 2 + 1].stLibere);
int mid = (tl + tr) / 2;
arb[ti].stLibere = arb[ti * 2].stLibere;
if (arb[ti].stLibere == mid - tl + 1)
{
arb[ti].stLibere += arb[ti * 2 + 1].stLibere;
}
arb[ti].drLibere = arb[ti * 2 + 1].drLibere;
if (arb[ti].drLibere == tr - mid)
{
arb[ti].drLibere += arb[ti * 2].drLibere;
}
}
void build(int tl = 1, int tr = n, int ti = 1)
{
if (tl == tr)
{
arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 1;
return;
}
int mid = (tl + tr) / 2;
build(tl, mid, ti * 2);
build(mid + 1, tr, ti * 2 + 1);
updateNode(ti, tl, tr);
}
void update(int qt, int ql, int qr, int tl = 1, int tr = n, int ti = 1)
{
// 1 = ocupa camere
// 2 = elibereaza camere
int lungime = tr - tl + 1;
if (lazy[ti])
{
if (lazy[ti] == 1)
{
arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 0;
}
else
{
arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = lungime;
}
if (tl < tr)
{
lazy[ti * 2] = lazy[ti * 2 + 1] = lazy[ti];
}
lazy[ti] = 0;
}
// not included
if (tr < ql || qr < tl)
{
return;
}
// fully included
if (ql <= tl && tr <= qr)
{
if (qt == 1)
{
arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 0;
}
else
{
arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = lungime;
}
if (tl < tr)
{
lazy[ti * 2] = lazy[ti * 2 + 1] = qt;
}
return;
}
// partial included
int mid = (tl + tr) / 2;
update(qt, ql, qr, tl, mid, ti * 2);
update(qt, ql, qr, mid + 1, tr, ti * 2 + 1);
updateNode(ti, tl, tr);
}
int main()
{
fin >> n >> q;
build();
while (q--)
{
int c;
fin >> c;
if (c == 3)
{
fout << arb[1].totalLibere << '\n';
}
else
{
int l, nr;
fin >> l >> nr;
int r = l + nr - 1;
update(c, l, r);
}
}
}