Pagini recente » Borderou de evaluare (job #2912706) | Borderou de evaluare (job #202281) | Borderou de evaluare (job #2016802) | Cod sursa (job #921200) | Cod sursa (job #447877)
Cod sursa(job #447877)
#include<cstdio>
#include<iostream>
using namespace std;
const int NMAX = 100010;
const int ARBMAX = 1<<18;
struct arbore
{
int sir, p, q;
} Arb[ARBMAX];
//int viz[NMAX];
int iden, x, y;
int N, P;
inline int max(int a, int b, int c)
{
if(a >= b && a >= c) return a;
if(b >= a && b >= c) return b;
return c;
}
void update(int nod, int st, int dr)
{
if( x <= st && dr <= y)
{
if(iden == 1)
Arb[nod].sir = Arb[nod].p = Arb[nod].q = 0;
if(iden == 2)
Arb[nod].sir = Arb[nod].p = Arb[nod].q = dr - st + 1;
return;
}
int mij = (st + dr)/2;
if(Arb[nod].sir == 0)
{
Arb[2*nod].sir = Arb[2*nod].p = Arb[2*nod].q = 0;
Arb[2*nod + 1].sir = Arb[2*nod + 1].p = Arb[2*nod + 1].q = 0;
}
if(Arb[nod].sir == dr - st + 1)
{
Arb[2*nod].sir = Arb[2*nod].p = Arb[2*nod].q = mij - st + 1;
Arb[2*nod + 1].sir = Arb[2*nod + 1].p = Arb[2*nod + 1].q = dr - (mij + 1) + 1;
}
if(x <= mij)
update(2 * nod, st, mij);
if(y >= mij+1)
update(2 * nod + 1, mij + 1, dr);
Arb[nod].sir = max(Arb[2 * nod].sir, Arb[2 * nod].q + Arb[2 * nod + 1].p, Arb[2 * nod + 1].sir);
if(Arb[2 * nod].sir == mij - st + 1)
Arb[nod].p = Arb[2 * nod].p + Arb[2 * nod + 1].p;
else
Arb[nod].p = Arb[2 * nod].p;
if(Arb[2 * nod + 1].sir == dr - (mij + 1) + 1)
Arb[nod].q = Arb[2 * nod].q + Arb[2 * nod + 1].q;
else
Arb[nod].q = Arb[2 * nod + 1].q;
}
void citire()
{
cin >> N >> P;
Arb[1].sir = Arb[1].p = Arb[1].q = N;
for(int i = 1 ; i <= P ; i++)
{
cin >> iden;
if(iden < 3)
{
cin >> x >> y;
y += x - 1;
update(1, 1, N);
}
else
cout << Arb[1].sir << '\n';
}
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
citire();
return 0;
}