Pagini recente » Cod sursa (job #686406) | Cod sursa (job #1774179) | Cod sursa (job #2585311) | Cod sursa (job #579621) | Cod sursa (job #858456)
Cod sursa(job #858456)
#include <cstdio>
using namespace std;
#define MaxN 100050
#define fs(x) ((x)*2)
#define fd(x) ((x)*2+1)
struct Nod{int left,right,all;};
Nod Arb[4*MaxN];
int N,P,i,A,B,j,Op;
void init(int nod,int st,int dr)
{
Arb[nod].left=Arb[nod].right=Arb[nod].all=dr-st+1;
if(st==dr)
return;
int div=(st+dr)/2;
init(fs(nod),st,div);
init(fd(nod),div+1,dr);
}
inline int Maxim(int a,int b)
{ return (a>b) ? a : b ; }
void Update(int nod,int st,int dr)
{
int Val;
if(A<=st && dr<=B)
{
if(Op)
Val=dr-st+1;
else
Val=0;
Arb[nod].left=Arb[nod].right=Arb[nod].all=Val;
return;
}
int div=(st+dr)/2;
if(Arb[nod].all==dr-st+1)
{
Arb[fs(nod)].left=Arb[fs(nod)].right=Arb[fs(nod)].all=div-st+1;
Arb[fd(nod)].left=Arb[fd(nod)].right=Arb[fd(nod)].all=dr-div;
}
if(!Arb[nod].all)
{
Arb[fs(nod)].left=Arb[fs(nod)].right=Arb[fs(nod)].all=0;
Arb[fd(nod)].left=Arb[fd(nod)].right=Arb[fd(nod)].all=0;
}
if(A<=div)
Update(fs(nod),st,div);
if(div<B)
Update(fd(nod),div+1,dr);
Arb[nod].left=Arb[fs(nod)].left;
Arb[nod].right=Arb[fd(nod)].right;
Arb[nod].all=Maxim(Arb[fs(nod)].all,Arb[fd(nod)].all);
Arb[nod].all=Maxim(Arb[nod].all,Arb[fs(nod)].right+Arb[fd(nod)].left);
if(Arb[nod].left==div-st+1)
Arb[nod].left+=Arb[fd(nod)].left;
if(Arb[nod].right==dr-div)
Arb[nod].right+=Arb[fs(nod)].right;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&N,&P);
init(1,1,N);
for(i=1;i<=P;i++)
{
scanf("%d",&Op);
if(Op==3)
printf("%d\n",Arb[1].all);
else
{
scanf("%d%d",&A,&B);
B=A+B-1;
Op--;
Update(1,1,N);
}
}
return 0;
}