Pagini recente » Cod sursa (job #1940370) | Cod sursa (job #142755) | Cod sursa (job #1804330) | Cod sursa (job #585593) | Cod sursa (job #858508)
Cod sursa(job #858508)
#include <fstream>
using namespace std;
ifstream F("hotel.in");
ofstream G("hotel.out");
const int Nmax = 100010;
struct Arb_Int
{
int left, right;
int best, mark;
};
#define L_son (2*Nod)
#define R_son (2*Nod+1)
Arb_Int A[Nmax << 2];
int N,P;
int st,dr,type;
void Build(int nod,int st,int dr)
{
A[nod].left = A[nod].right = A[nod].best =(dr-st)+1;
A[nod].mark = 0;
int mij=(st+dr)/2;
if ( st == dr ) return;
Build(nod*2,st,mij);
Build(nod*2+1,mij+1,dr);
}
void Update(int Nod,int St,int Dr)
{
if ( st <= St && Dr <= dr )
{
int Val = type == 0 ? Dr - St + 1 : 0 ;
A[Nod].best = A[Nod].left = A[Nod].right = Val;
return;
}
int Mid = (St + Dr) / 2;
if ( A[Nod].best == Dr-St+1 )
{
A[L_son].left=A[L_son].right=A[L_son].best = Mid - St + 1;
A[R_son].left=A[R_son].right=A[R_son].best = Dr - Mid;
}
if ( A[Nod].best == 0)
{
A[L_son].left=A[L_son].right=A[L_son].best = 0;
A[R_son].left=A[R_son].right=A[R_son].best = 0;
}
if ( st <= Mid ) Update( L_son , St , Mid );
if ( Mid < dr ) Update( R_son , Mid+1 , Dr );
A[Nod].left = A[L_son].left;
A[Nod].right = A[R_son].right;
A[Nod].best = max( A[L_son].best , A[R_son].best );
A[Nod].best = max( A[Nod].best , A[L_son].right + A[R_son].left );
if ( A[Nod].left == Mid - St + 1 )
A[Nod].left += A[R_son].left;
if ( A[Nod].right == Dr - Mid )
A[Nod].right += A[L_son].right;
}
int main()
{
F>>N>>P;
Build(1,1,N);
for (int i=1;i<=P;++i)
{
F>>type, --type;
if ( type < 2 )
{
F>>st>>dr;
type = 1-type;
dr += st-1;
Update(1,1,N);
}
else
G<<A[1].best<<'\n';
}
}