Pagini recente » Cod sursa (job #1561229) | Cod sursa (job #3173886) | Cod sursa (job #1904512) | Cod sursa (job #229566) | Cod sursa (job #1364893)
// hotel
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMax 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,q;
int p,m;
int L[6 * NMax];
int R[6 * NMax];
int A[6 * NMax];
int rooms, roomf; // camera de inceput si camera de final pe care vin turisti
/// m = turistii care vin
void update(int nod, int left, int right, int val) {
if (rooms <= left && right <= roomf) {
A[nod] = L[nod] = R[nod] = val*(right-left+1);
return;
}
int mid = (left+right)/2;
if (A[nod] == 0) {
A[2*nod] = L[2*nod] = R[2*nod] = 0;
A[2*nod+1] = L[2*nod+1] = R[2*nod+1] = 0;
} else if (A[nod] == right - left + 1) {
A[2*nod]=L[2*nod]=R[2*nod]=mid-left+1;
A[2*nod+1]=L[2*nod+1]=R[2*nod+1]=right-mid;
}
if (rooms <= mid)
update(2*nod, left, mid, val);
if (roomf > mid)
update(2*nod+1, mid+1, right, val);
if (L[2*nod] == mid-left+1)
L[nod] = L[2*nod]+L[2*nod+1];
else
L[nod] = L[2*nod];
if (R[2*nod+1] == right-mid)
R[nod] = R[2*nod]+R[2*nod+1];
else
R[nod] = R[2*nod+1];
A[nod] = max(max(max(A[2*nod], A[2*nod+1]), R[2*nod]+L[2*nod+1]), max(L[nod], R[nod]));
}
void read() {
f>>n>>q;
rooms = 1; roomf = n;
update(1,1,n,1);
for (int i=1;i<=q;i++) {
int type; f>>type;
if (type == 1) {
f>>p>>m;
rooms = p;
roomf = p+m-1;
update(1,1,n,0);
} else if (type == 2) {
f>>p>>m;
rooms = p;
roomf = p+m-1;
update(1,1,n,1);
} else if (type == 3) {
// Intrebarea proprietarului
g<<A[1]<<'\n';
}
}
}
int main() {
read();
f.close(); g.close();
return 0;
}