Pagini recente » Cod sursa (job #1756256) | Cod sursa (job #2426807) | Cod sursa (job #2838681) | Cod sursa (job #2430310) | Cod sursa (job #1450510)
#include <fstream>
using namespace std;
const int kMaxSize = 262150;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct {
int left, right, best;
} a[kMaxSize];
int N, P;
void Initialize(int node, int l, int r) {
a[node].left = a[node].right = a[node].best = r - l + 1;
if (l == r)
return;
int ls = node << 1, rs = ls + 1;
int m = (l + r) / 2;
Initialize(ls, l, m);
Initialize(rs, m + 1, r);
}
void Update(int node, int l, int r, int rl, int rr, int type) {
if (rr < l || r < rl)
return;
if (rl <= l && r <= rr) {
if (type == 1)
a[node].left = a[node].right = a[node].best = 0;
else
a[node].left = a[node].right = a[node].best = r - l + 1;
return;
}
int ls = node << 1, rs = ls + 1;
int m = (l + r) / 2;
if (a[node].best == 0) {
a[ls].left = a[ls].right = a[ls].best = 0;
a[rs].left = a[rs].right = a[rs].best = 0;
} else if (a[node].best == r - l + 1) {
a[ls].left = a[ls].right = a[ls].best = m - l + 1;
a[rs].left = a[rs].right = a[rs].best = r - m;
}
Update(ls, l, m, rl, rr, type);
Update(rs, m + 1, r, rl, rr, type);
a[node].left = a[ls].left;
if (a[ls].left == m - l + 1)
a[node].left += a[rs].left;
a[node].right = a[rs].right;
if (a[rs].right == r - m)
a[node].right += a[ls].right;
a[node].best = max(max(a[ls].best, a[rs].best), a[ls].right + a[rs].left);
}
int main() {
fin >> N >> P;
Initialize(1, 1, N);
while (P--) {
int t, l, r, s;
fin >> t;
if (t == 3) {
fout << a[1].best << "\n";
} else {
fin >> l >> s;
r = l + s - 1;
Update(1, 1, N, l, r, t);
}
}
return 0;
}