Pagini recente » Cod sursa (job #611229) | Cod sursa (job #2491484) | Cod sursa (job #394680) | Autentificare | Cod sursa (job #2465083)
#include <fstream>
#include <iostream>
#define MAX 100001
using namespace std;
struct
{
int nr, left, right;
bool lazy;
}aint[MAX * 3];
int a, b, c;
bool sign;
void update(int nod, int st, int dr)
{
if(a <= st && dr <= b)
{
if(sign)aint[nod].nr = aint[nod].left = aint[nod].right = dr - st + 1;
else aint[nod].nr = aint[nod].left = aint[nod].right = 0;
aint[nod].lazy = 1;
return;
}
int mij = (st + dr) / 2;
if(aint[nod].lazy)
{
aint[nod].lazy = 0;
if(aint[nod].nr != 0)
{
aint[nod * 2].nr = aint[nod * 2].left = aint[nod * 2].right = mij - st + 1;
aint[nod * 2 + 1].nr = aint[nod * 2 + 1].left = aint[nod * 2 + 1].right = dr - mij;
}
else
{
aint[nod * 2].nr = aint[nod * 2].left = aint[nod * 2].right = 0;
aint[nod * 2 + 1].nr = aint[nod * 2 + 1].left = aint[nod * 2 + 1].right = 0;
}
aint[nod * 2].lazy = aint[nod * 2 + 1].lazy = 1;
}
if(a <= mij)update(nod * 2, st, mij);
if(b > mij)update(nod * 2 + 1, mij + 1, dr);
aint[nod].nr = max(aint[nod * 2].nr, aint[nod * 2 + 1].nr);
aint[nod].nr = max(aint[nod].nr, aint[nod * 2].right + aint[nod * 2 + 1].left);
aint[nod].left = aint[nod * 2].left;
if(aint[nod * 2].left == mij - st + 1)aint[nod].left += aint[nod * 2 + 1].left;
aint[nod].right = aint[nod * 2 + 1].right;
if(aint[nod * 2 + 1].right == dr - mij)aint[nod].right += aint[nod * 2].right;
}
int main()
{
int n, p, i, sol;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
fin >> n >> p;
a = 1;
b = n;
sign = 1;
update(1, 1, n);
for(i = 0; i < p; i++)
{
fin >> c;
if(c == 3)
{
sol = aint[1].nr;
sol = max(sol, aint[1].left);
sol = max(sol, aint[1].right);
fout << sol << '\n';
}
else
{
fin >> a >> b;
b = a + b - 1;
if(c == 1)sign = 0;
else sign = 1;
update(1, 1, n);
}
}
fin.close();
fout.close();
return 0;
}