Pagini recente » Cod sursa (job #2477100) | Cod sursa (job #322278) | Cod sursa (job #158135) | Cod sursa (job #1634183) | Cod sursa (job #1149349)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
#define NMAX 100001
#define L (n << 1)
#define R (L | 1)
int i, op, M, N, P;
int Ans[NMAX * 3];
int Left[NMAX * 3];
int Right[NMAX * 3];
inline void update(int n, int l, int r, int i, int j, int v) {
if (i <= l && r <= j) {
Ans[n] = Left[n] = Right[n] = (r - l + 1) * v;
return;
}
int m = (l + r) >> 1;
if (v == 1) {
if (Ans[n] == 0) {
Left[L] = Left[R] = Right[L] = Right[R] = Ans[L] = Ans[R] = 0;
Ans[n] = r - l + 1;
}
}
else {
if (Ans[n] == r - l + 1) {
Ans[L] = Left[L] = Right[L] = m - l + 1;
Ans[R] = Left[R] = Right[R] = r - (m + 1) + 1;
Ans[n] = Left[n] = Right[n] = 0;
}
}
if (i <= m) update(L, l, m, i, j, v);
if (j > m) update(R, m + 1, r, i, j, v);
Left[n] = Left[L];
if (Ans[L] == m - l + 1) Left[n] = Ans[L] + Left[R];
Right[n] = Right[R];
if (Ans[R] == r - (m + 1) + 1) Right[n] = Ans[R] + Right[L];
Ans[n] = max(Right[L] + Left[R], max(Ans[L], Ans[R]));
Ans[n] = max(Ans[n], max(Left[n], Right[n]));
}
int main() {
fin >> N >> P;
update(1, 1, N, 1, N, 1);
while (P--) {
fin >> op;
if (op == 3) {
fout << Ans[1] << '\n';
continue;
}
fin >> i >> M;
if (op == 2) {
update(1, 1, N, i, i + M - 1, 1);
continue;
}
update(1, 1, N, i, i + M - 1, 0);
}
return 0;
}