Pagini recente » Cod sursa (job #1618217) | Cod sursa (job #2482967) | Cod sursa (job #321568) | Cod sursa (job #2448054) | Cod sursa (job #1211641)
#include <fstream>
#define DIMN 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct arbint {
int v;
int l;
int r;
} A[4*DIMN];
int a,b,nr,n,m,op;
void init (int nod, int st, int dr) {
if(st==dr)
{
A[nod].v = A[nod].l = A[nod].r = 1;
return ;
}
int mid = (st+dr)/2;
init(2*nod, st, mid);
init(2*nod+1, mid+1, dr);
A[nod].v = A[nod].l = A[nod].r = A[2*nod].v + A[2*nod+1].v;
}
void update (int nod, int st, int dr) {
if (a<=st && dr<=b) {
if (nr==1)
A[nod].v = A[nod].l = A[nod].r = 0;
else
A[nod].v = A[nod].l = A[nod].r = dr - st + 1;
return;
}
if (st == dr)
return;
int mid = (st+dr)/2;
if (A[nod].v == 0)
A[2*nod].v = A[2*nod].l = A[2*nod].r = A[2*nod+1].v = A[2*nod+1].l = A[2*nod+1].r = 0;
if (A[nod].v == dr-st+1)
A[2*nod].v = A[2*nod].l = A[2*nod].r = mid-st+1, A[2*nod+1].v = A[2*nod+1].l = A[2*nod+1].r = dr-mid;
if (a<=mid)
update (2*nod, st, mid);
if (mid<b)
update (2*nod+1, mid+1, dr);
A[nod].v = max(A[2*nod].v,max(A[2*nod+1].v,A[2*nod].r+A[2*nod+1].l));
if (A[2*nod].l == mid-st+1)
A[nod].l = A[2*nod].l + A[2*nod+1].l;
else
A[nod].l = A[2*nod].l;
if (A[2*nod+1].r == dr-mid)
A[nod].r = A[2*nod+1].r + A[2*nod].r;
else
A[nod].r = A[2*nod+1].r;
}
int main () {
f >> n >> m;
init(1,1,n);
for (; m; --m) {
f >> op;
if (op == 1) {
f >> a;
f >> b;
b = a + b - 1;
nr = 1;
update (1,1,n);
}
else
if (op == 2) {
f >> a;
f >> b;
b = a + b - 1;
nr = 0;
update (1,1,n);
}
else
g << A[1].v << "\n";
}
return 0;
}