Pagini recente » Cod sursa (job #1449301) | Cod sursa (job #472317) | Cod sursa (job #2283629) | Cod sursa (job #495971) | Cod sursa (job #318851)
Cod sursa(job #318851)
#include <cstdio>
#define MAX_N 400005
#define mij ((li + lf) >> 1)
#define nst nod << 1
#define ndr nst | 1
struct arb
{
int all, st, dr;
} A[MAX_N];
int N, P, X;
int st, dr;
inline int Max(const int &A, const int &B)
{
return ((A) > (B))? (A) : (B);
}
void build(int nod, int li, int lf)
{
A[nod].all = A[nod].st = A[nod].dr = lf - li + 1;
if(li == lf) return;
build(nst, li, mij);
build(ndr, mij+1, lf);
}
void update(int nod, int li, int lf)
{
if(st <= li && lf <= dr)
{
if(!X)
A[nod].all = A[nod].st = A[nod].dr = 0;
else A[nod].all = A[nod].st = A[nod].dr = lf - li + 1;
return;
}
if(A[nod].all == lf - li + 1)
{
A[nst].all = A[nst].st = A[nst].dr = mij - li + 1;
A[ndr].all = A[ndr].st = A[ndr].dr = lf - mij;
}
if(A[nod].all == 0)
{
A[nst].all = A[nst].st = A[nst].dr = 0;
A[ndr].all = A[ndr].st = A[ndr].dr = 0;
}
if(st <= mij) update(nst, li, mij);
if(mij < dr) update(ndr, mij+1, lf);
A[nod].st = A[nst].st;
A[nod].dr = A[ndr].dr;
A[nod].all = Max(A[nst].all, A[ndr].all);
A[nod].all = Max(A[nod].all, A[nst].dr + A[ndr].st);
if(A[nst].st == mij - li + 1)
A[nod].st += A[ndr].st;
if(A[ndr].dr == lf - mij)
A[nod].dr += A[nst].dr;
}
int main()
{
freopen("hotel.in","rt",stdin);
freopen("hotel.out","wt",stdout);
scanf("%d %d",&N, &P);
build(1, 1, N);
while(P--)
{
scanf("%d",&X);
if(X == 3) printf("%d\n",A[1].all);
else
{
int x, y;
scanf("%d %d",&x, &y);
st = x;
dr = x + y - 1;
--X;
update(1, 1, N);
}
}
}