Pagini recente » Cod sursa (job #1619681) | Clasament going_oni | Cod sursa (job #1468041) | Cod sursa (job #2344926) | Cod sursa (job #1133603)
#include <cstdio>
#include <algorithm>
#define NMAX 100007
using namespace std;
struct hotel{
int a;
int b;
int c;
};
hotel Arbi[NMAX * 3];
int _x, _y;
void update(int Nod, int st, int dr, int Val){
if(st >= _x && dr <= _y){
int F = Nod;
Arbi[F].a = Arbi[F].b = Arbi[F].c = Val * (dr - st + 1);
return ;
}
int med = (st + dr) >> 1, F = 2 * Nod;
if(Arbi[Nod].c == 0){
Arbi[F].a = Arbi[F].b = Arbi[F].c = 0;
Arbi[F + 1].a = Arbi[F + 1].b = Arbi[F + 1].c = 0;
}
if(Arbi[Nod].c == dr - st + 1){
Arbi[F].a = Arbi[F].b = Arbi[F].c = med - st + 1;
Arbi[F + 1].a = Arbi[F + 1].b = Arbi[F + 1].c = dr - med;
}
if(_x <= med)
update(Nod * 2, st, med, Val);
if(_y > med)
update(Nod * 2 + 1, med + 1, dr, Val);
if(Arbi[F].a == med - st + 1)
Arbi[Nod].a = Arbi[F].a + Arbi[F + 1].a;
else
Arbi[Nod].a = Arbi[F].a;
if(Arbi[F + 1].b == dr - med)
Arbi[Nod].b = Arbi[F + 1].b + Arbi[F].b;
else
Arbi[Nod].b = Arbi[F + 1].b;
Arbi[Nod].c = Arbi[F].b + Arbi[F + 1].a;
Arbi[Nod].c = max(Arbi[Nod].c, max(Arbi[Nod].a, Arbi[Nod].b));
Arbi[Nod].c = max(Arbi[Nod].c, max(Arbi[F].c, Arbi[F + 1].c));
}
int main(){
int n, m;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d %d", &n, &m);
_x = 1;
_y = n;
update(1, 1, n, 1);
for(int i = 1; i <= m; ++i){
int Tip;
scanf("%d", &Tip);
if(Tip == 1){
scanf("%d %d", &_x, &_y);
_y += _x - 1;
update(1, 1, n, 0);
}
if(Tip == 2){
scanf("%d %d", &_x, &_y);
_y += _x - 1;
update(1, 1, n, 1);
}
if(Tip == 3)
printf("%d\n", Arbi[1].c);
}
return 0;
}