Pagini recente » Cod sursa (job #2743290) | Cod sursa (job #1001576) | Cod sursa (job #16918) | Cod sursa (job #2794066) | Cod sursa (job #2758566)
#include <fstream>
using namespace std;
const int N = 1e5;
const int P2MAX = (1 << 18);
struct t {
int sum = 0;
int sum_st = 0;
int sum_dr = 0;
int sum_tot = 0;
};
t aint[P2MAX];
int a, b, val;
void actualizare(int p, int st, int dr) {
if (st >= a && dr <= b) {
aint[p].sum = aint[p].sum_st = aint[p].sum_dr = aint[p].sum_tot = val * (dr - st + 1);
return;
}
int m = (st + dr) / 2;
if (aint[p].sum_tot == dr - st + 1) {
aint[2 * p].sum = aint[2 * p].sum_st = aint[2 * p].sum_dr = aint[2 * p].sum_tot = m - st + 1;
aint[2 * p + 1].sum = aint[2 * p + 1].sum_st = aint[2 * p + 1].sum_dr = aint[2 * p + 1].sum_tot = dr - m;
}
else if (aint[p].sum_tot == 0) {
aint[2 * p].sum = aint[2 * p].sum_st = aint[2 * p].sum_dr = aint[2 * p].sum_tot = 0;
aint[2 * p + 1].sum = aint[2 * p + 1].sum_st = aint[2 * p + 1].sum_dr = aint[2 * p + 1].sum_tot = 0;
}
if (a <= m)
actualizare(2 * p, st, m);
if (b > m)
actualizare(2 * p + 1, m + 1, dr);
aint[p].sum = max(aint[2 * p].sum, aint[2 * p + 1].sum);
aint[p].sum = max(aint[p].sum, aint[2 * p].sum_dr + aint[2 * p + 1].sum_st);
aint[p].sum_st = aint[2 * p].sum_st;
aint[p].sum_dr = aint[2 * p + 1].sum_dr;
if (aint[2 * p].sum_tot == m - st + 1)
aint[p].sum_st = aint[2 * p].sum_tot + aint[2 * p + 1].sum_st;
if (aint[2 * p + 1].sum_tot == dr - m)
aint[p].sum_dr = aint[2 * p + 1].sum_tot + aint[2 * p].sum_dr;
aint[p].sum_tot = aint[2 * p].sum_tot + aint[2 * p + 1].sum_tot;
}
int main() {
ifstream in("hotel.in");
ofstream out("hotel.out");
int n, q;
in >> n >> q;
a = 1, b = n, val = 1;
actualizare(1, 1, n);
while (q--) {
int cer;
in >> cer;
if (cer == 1) {
in >> a >> b;
b = a + b - 1;
val = 0;
actualizare(1, 1, n);
}
else if (cer == 2) {
in >> a >> b;
b = a + b - 1;
val = 1;
actualizare(1, 1, n);
}
else
out << aint[1].sum << '\n';
}
in.close();
out.close();
return 0;
}