Pagini recente » Cod sursa (job #3237387) | Cod sursa (job #2260213) | Cod sursa (job #1479229) | Cod sursa (job #1937325) | Cod sursa (job #2694088)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int const nmax = 100000;
int aint[4 * nmax + 10];
int ll[4 * nmax + 10]; // length l
int lr[4 * nmax + 10]; // length r
int n, p;
void build(int nod, int st, int dr) {
aint[nod] = lr[nod] = ll[nod] = dr - st + 1;
if(st == dr)
return;
int med = (st + dr) >> 1;
build(nod * 2, st, med);
build(nod * 2 + 1, med + 1, dr);
}
void update(int nod, int st, int dr, int l, int r, bool tip) {
if(l <= st && dr <= r) {
int var = (dr - st + 1);
if(tip == 0) var = 0;
aint[nod] = ll[nod] = lr[nod] = var;
return;
}
int med = (st + dr) >> 1;
// if aint[nod] == 0 || dr - st + 1 => aint[nod] got into the above if and its children weren't updated
// we update the children now:
if(aint[nod] == 0) {
aint[nod * 2] = ll[nod * 2] = lr[nod * 2] = 0;
aint[nod * 2 + 1] = ll[nod * 2 + 1] = lr[nod * 2 + 1] = 0;
} else if(aint[nod] == dr - st + 1) {
aint[nod * 2] = ll[nod * 2] = lr[nod * 2] = med - st + 1;
aint[nod * 2 + 1] = ll[nod * 2 + 1] = lr[nod * 2 + 1] = dr - med;
}
if(l <= med)
update(nod * 2, st, med, l, r, tip);
if(med < r)
update(nod * 2 + 1, med + 1, dr, l, r, tip);
ll[nod] = ll[nod * 2];
lr[nod] = lr[nod * 2 + 1];
if(ll[nod] == med - st + 1)
ll[nod] += ll[nod * 2 + 1];
if(lr[nod] == dr - med)
lr[nod] += lr[nod * 2];
aint[nod] = max(max(aint[nod * 2], aint[nod * 2 + 1]), lr[nod * 2] + ll[nod * 2 + 1]);
}
int main()
{
fin >> n >> p;
build(1, 1, n);
while(p--) {
int c;
fin >> c;
if(c == 3) {
fout << aint[1] << "\n";
} else {
int x, y;
fin >> x >> y;
update(1, 1, n, x, x + y - 1, (c == 2));
}
}
return 0;
}