Pagini recente » Cod sursa (job #1815759) | Cod sursa (job #1306675) | Cod sursa (job #1334832) | Cod sursa (job #645874) | Cod sursa (job #1808593)
#include <cstdio>
#include <algorithm>
using namespace std;
int k, tip, val, n, m, x, y, Sol;
struct arborel{
int Max, suf, pref, L;
} Arb[400088];
inline void Update(int st, int dr, int nod){
if(x <= st && dr <= y){
if(val == 0)
Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = dr - st + 1;
else
Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = 0;
return ;
}
int mid = (st + dr) / 2;
if(Arb[nod].Max == 0)
Arb[nod * 2].Max = Arb[nod * 2].suf = Arb[nod * 2].pref = Arb[nod * 2 + 1].suf = Arb[nod * 2 + 1].pref = Arb[nod * 2 + 1].Max = 0;
else if(Arb[nod].Max == dr - st + 1){
Arb[nod * 2].Max = Arb[nod * 2].suf = Arb[nod * 2].pref = mid - st + 1;
Arb[nod * 2 + 1].Max = Arb[nod * 2 + 1].suf = Arb[nod * 2 + 1].pref = dr - mid;
}
if(mid >= x) Update(st, mid, nod * 2);
if(mid < y) Update(mid + 1, dr, nod * 2 + 1);
if(Arb[nod * 2].pref == Arb[nod * 2].L)
Arb[nod].pref = Arb[nod * 2].L + Arb[nod * 2 + 1].pref;
else
Arb[nod].pref = Arb[nod * 2].pref;
if(Arb[nod * 2 + 1].suf == Arb[nod * 2 + 1].L)
Arb[nod].suf = Arb[nod * 2 + 1].L + Arb[nod * 2].suf;
else
Arb[nod].suf = Arb[nod * 2 + 1].suf;
Arb[nod].Max = max((Arb[nod * 2 + 1].Max, Arb[nod * 2].Max), Arb[nod * 2].suf + Arb[nod * 2 + 1].pref);
}
inline void BuildArb(int st, int dr, int nod){
Arb[nod].L = Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = dr - st + 1;
if(st == dr) return ;
int mid = (st + dr) / 2;
BuildArb(st, mid, nod * 2);
BuildArb(mid + 1, dr, nod * 2 + 1);
}
int main()
{
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d%d", &n, &m);
BuildArb(1, n, 1);
for(int i = 1; i <= m ; ++i){
scanf("%d", &tip);
if(tip == 1){
scanf("%d%d", &x, &y);
y = y + x - 1; val = 1;
Update(1, n, 1);
}else if(tip == 2){
scanf("%d%d", &x, &y);
y = y + x - 1; val = 0;
Update(1, n, 1);
}else
printf("%d\n", Arb[1].Max);
}
return 0;
}