Pagini recente » Istoria paginii runda/cerculdeinfo-lectia7-grafuri/clasament | Istoria paginii runda/pauloji_2010/clasament | Istoria paginii runda/pc_11a/clasament | Cod sursa (job #1504940) | Cod sursa (job #973325)
Cod sursa(job #973325)
#include <cstdio>
#include <algorithm>
using namespace std;
const int DMAX = 1000003;
int st, dr, L[DMAX << 1], R[DMAX << 1];
bool h;
struct Aint {
int m, l, r;
}aint[DMAX << 1];
void AINT_build (const int l, const int r, const int nod) {
L[nod] = l;
R[nod] = r;
if (l == r) {
aint[nod].m = aint[nod].l = aint[nod].r = 1;
return;
}
const int m = (l + r) >> 1;
aint[nod].m = aint[nod].l = aint[nod].r = r - l + 1;
AINT_build (l, m, nod * 2);
AINT_build (m + 1, r, nod * 2 + 1);
}
void AINT_update (const int nod) {
if (dr < L[nod] || st > R[nod])
return;
if (st <= L[nod] && R[nod] <= dr) {
aint[nod].m = aint[nod].l = aint[nod].r = h ? R[nod] - L[nod] + 1 : 0;
return;
}
AINT_update (nod * 2);
AINT_update (nod * 2 + 1);
int m = (R[nod] + L[nod]) >> 1;
aint[nod].l = aint[nod * 2].l != m - L[nod] + 1 ? aint[nod * 2].l : aint[nod * 2].l + aint[nod * 2 + 1].l;
aint[nod].r = aint[nod * 2 + 1].r != R[nod] - m ? aint[nod * 2 + 1]. r : aint[nod * 2 + 1].r + aint[nod * 2].r;
aint[nod].m = max(max(max(aint[nod].l, aint[nod].r), max(aint[nod * 2].m, aint[nod * 2 + 1].m)), aint[nod * 2].r + aint[nod * 2 + 1].l);
}
int main () {
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int N, P, t, a, b;
scanf ("%d%d", &N, &P);
AINT_build (1, N, 1);
while (P--) {
scanf ("%d", &t);
if (t == 1) {
scanf ("%d%d", &a, &b);
st = a;
dr = a + b - 1;
h = 0;
AINT_update (1);
continue;
}
if (t == 2) {
scanf ("%d%d", &a, &b);
st = a;
dr = a + b - 1;
h = 1;
AINT_update (1);
continue;
}
printf ("%d\n", aint[1].m);
}
}