Pagini recente » Cod sursa (job #2949055) | Cod sursa (job #1778706) | Cod sursa (job #1167604) | Cod sursa (job #1304691) | Cod sursa (job #1872191)
#include <fstream>
using namespace std;
struct elem {
int maxim;
int stanga;
int dreapta;
};
elem A[400010];
int n, p, t, a, b;
void update(int nod, int st, int dr, int a, int b, int upd) {
if (a <= st && b >= dr) {
if (upd == 1) {
A[nod].maxim = A[nod].stanga = A[nod].dreapta = 0;
} else {
A[nod].maxim = A[nod].stanga = A[nod].dreapta = dr-st+1;
}
} else {
int mid = (st + dr) / 2;
//lazy update
if (A[nod].maxim == 0) {
A[2*nod].maxim = A[2*nod].stanga = A[2*nod].dreapta = 0;
A[2*nod+1].maxim = A[2*nod+1].stanga = A[2*nod+1].dreapta = 0;
}
if (A[nod].maxim == dr-st+1) {
A[2*nod].maxim = A[2*nod].stanga = A[2*nod].dreapta = mid-st+1;
A[2*nod+1].maxim = A[2*nod+1].stanga = A[2*nod+1].dreapta = dr-mid;
}
if (a <= mid)
update(2*nod, st, mid, a, b, upd);
if (b > mid)
update(2*nod+1, mid+1, dr, a, b, upd);
A[nod].maxim = max(A[2*nod].maxim, max(A[2*nod+1].maxim, A[2*nod].dreapta + A[2*nod+1].stanga));
A[nod].stanga = A[2*nod].stanga;
if (A[nod].stanga == mid-st+1)
A[nod].stanga += A[2*nod+1].stanga;
A[nod].dreapta = A[2*nod+1].dreapta;
if (A[nod].dreapta == dr-mid)
A[nod].dreapta += A[2*nod].dreapta;
//A[nod].maxim = max(A[nod].maxim, max(A[nod].stanga, A[nod].dreapta));
}
}
void build(int nod, int st, int dr) {
if (st == dr) {
A[nod].maxim = A[nod].stanga = A[nod].dreapta = 1;
} else {
A[nod].maxim = A[nod].stanga = A[nod].dreapta = dr-st+1;
int mid = (st + dr)/2;
build(2*nod, st, mid);
build(2*nod+1, mid+1, dr);
}
}
int main () {
ifstream fin("hotel.in");
ofstream fout("hotel.out");
fin>>n>>p;
build(1, 1, n);
while (p--) {
fin>>t;
if (t == 1) {
fin >> a >> b;
b = a + b - 1;
update(1, 1, n, a, b, 1);
}
if (t == 2) {
fin >> a >> b;
b = a + b - 1;
update(1, 1, n, a, b, -1);
}
if (t == 3) {
fout<<A[1].maxim<<"\n";
}
}
return 0;
}