Pagini recente » Cod sursa (job #1201353) | Cod sursa (job #359308) | Cod sursa (job #174997) | Cod sursa (job #2152774) | Cod sursa (job #1450515)
#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 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;
Update(1, 1, N, 1, N, 2);
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;
}