Pagini recente » Cod sursa (job #1370507) | Cod sursa (job #668686) | Cod sursa (job #924328) | Cod sursa (job #1878716) | Cod sursa (job #874436)
Cod sursa(job #874436)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int n, m, cod, A, B, poz;
struct arbore
{
int st, dr, maxim;
};
arbore aint[262145];
inline void Update(int nod, int st, int dr)
{
if (A <= st && dr <= B)
{
if (cod == 1) // sosire
aint[nod].maxim = aint[nod].st = aint[nod].dr = 0; // nu mai am nicio camera libera in itervalul [st, dr];
else // plecare
aint[nod].maxim = aint[nod].st = aint[nod].dr = dr - st + 1; // se elibereaza toate camerele pentru intervalul [st, dr]
return ;
}
int mij = (st+dr)>>1, fiu = nod<<1;
if (aint[nod].maxim == dr - st + 1)// daca le am pe toate libere, inseamna ca am si fii liberi
{
aint[fiu].maxim = aint[fiu].st = aint[fiu].dr = mij - st + 1;
aint[fiu+1].maxim = aint[fiu+1].st = aint[fiu+1].dr = dr - mij;
}
if (aint[nod].maxim == 0) // daca le am pe toate ocupate, inseamna ca am si toti fii ocupati
{
aint[fiu].maxim = aint[fiu+1].maxim = 0;
aint[fiu].st = aint[fiu+1].st = 0;
aint[fiu].dr = aint[fiu+1].dr = 0;
}
if (A <= mij)
Update (fiu, st, mij);
if (mij < B)
Update (fiu+1, mij+1, dr);
aint[nod].st = aint[fiu].st;
if (aint[fiu].st >= mij - st + 1) // daca am tot fiul stang liber atunci pot continua cu fiul drept
aint[nod].st += aint[fiu+1].st;
aint[nod].dr = aint[fiu+1].dr;
if (aint[fiu+1].dr >= dr - mij) // daca am tot fiul drept liber pot continua cu fiul stang
aint[nod].dr += aint[fiu].dr;
aint[nod].maxim = max(max(aint[fiu].maxim, aint[fiu+1].maxim), max(max (aint[nod].st, aint[nod].dr),aint[fiu].dr + aint[fiu+1].st));
return ;
}
inline void Build(int nod, int st, int dr)
{
if (st == dr)
{
aint[nod].st = aint[nod].maxim = aint[nod].dr = 1;
return;
}
int mij = (st+dr)>>1, fiu = nod<<1;
Build(fiu, st, mij);
Build(fiu+1, mij+1, dr);
aint[nod].st = aint[nod].dr = aint[nod].maxim = aint[fiu].maxim + aint[fiu+1].maxim;
}
inline void Scrie()
{
ofstream g("test.txt");
int i;
for(i=1; i<=32; i++)
g<<aint[i].st<<" "<<aint[i].maxim<<" "<<aint[i].dr<<"\n";
g.close();
}
inline void Solve()
{
ifstream f ("hotel.in");
ofstream g ("hotel.out");
f>>n>>m;
cod = 2;
A = 1;
B = n;
//Update(1, 1, n);
Build (1, 1, n);
//Scrie();
while (m)
{
m--;
f>>cod;
if (cod == 3)
{
g<<aint[1].maxim<<"\n";
}
else
{
f>>A>>B;
B = A+B-1;
Update(1, 1, n);
}
}
f.close();
g.close();
}
int main()
{
Solve();
return 0;
}