Pagini recente » Cod sursa (job #2737620) | Cod sursa (job #2711996) | Cod sursa (job #2799186) | Cod sursa (job #933709) | Cod sursa (job #296649)
Cod sursa(job #296649)
using namespace std;
#include <bitset>
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define mp make_pair
#define IN "hotel.in"
#define OUT "hotel.out"
int tip,x,y,N,M;
struct aint{int s,d,m;} A[1<<18];
II void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d",&N,&M);
}
II void build(int nod,int st,int dr)
{
int ln = nod<<1;
int rn = ln+1;
int mij = (st+dr) >> 1;
if(st == dr)
{
A[nod].s = A[nod].d = A[nod].m = 1;
return;
}
build(ln,st,mij);
build(rn,mij+1,dr);
A[nod].s = A[nod].d = A[nod].m = dr-st+1;
}
II void update(int nod,int st,int dr)
{
int ln = nod<<1;
int rn = ln+1;
int mij = (st+dr) >> 1;
if(x <= st && dr <= y)
{
A[nod].m = A[nod].s = A[nod].d = (dr - st +1) * tip;
return;
}
if(A[nod].m == (1 - tip) * (dr - st + 1) )
{
A[ln].m = A[ln].s = A[ln].d = (1 - tip) * (mij - st + 1);
A[rn].m = A[rn].s = A[rn].d = (1 - tip) * (dr - mij);
}
if(x <= mij)
update(ln,st,mij);
if(y > mij)
update(rn,mij+1,dr);
A[nod].s = A[ln].s + (A[ln].s == mij-st+1 ? A[rn].s:0);
A[nod].d = A[rn].d + (A[rn].d == dr-mij ? A[ln].d:0);
A[nod].m = max(A[nod].s,A[nod].d);
A[nod].m = max(max(A[ln].s,A[rn].m) ,max(A[nod].m,A[ln].d + A[rn].s) );
}
II void solve()
{
build(1,1,N);
FOR(i,1,M)
{
scanf("%d",&tip);
if(tip!=3)
{
--tip;
scanf("%d%d",&x,&y);
y += x-1;
update(1,1,N);
}
else
printf("%d\n",A[1].m);
}
}
int main()
{
scan();
solve();
return 0;
}