Pagini recente » Cod sursa (job #3238533) | Cod sursa (job #1464017) | Cod sursa (job #1861903) | Borderou de evaluare (job #2285655) | Cod sursa (job #2158903)
#include <fstream>
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
struct
{
int maxi, stanga, dreapta;
} arb[ 400005 ];
int n, p, i, tip, x, y;
void update ( int nod, int st, int dr, int L, int R, int val )
{
if ( st > R || dr < L )
{
return;
}
if ( st >= L && dr <= R )
{
arb[ nod ].maxi = arb[nod].stanga = arb[nod].dreapta = val * ( dr - st + 1 );
return;
}
int mij = (st+dr) / 2;
if ( arb[nod].maxi == 0 )
{
arb[2*nod].maxi = arb[2*nod].stanga = arb[2*nod].dreapta = 0;
arb[2*nod+1].maxi = arb[2*nod+1].stanga = arb[2*nod+1].dreapta = 0;
}
if ( arb[nod].maxi == dr - st + 1 )
{
arb[2*nod].maxi = arb[2*nod].stanga = arb[2*nod].dreapta = mij-st + 1;
arb[2*nod+1].maxi = arb[2*nod+1].stanga = arb[2*nod+1].dreapta = dr - mij;
}
update ( 2*nod, st, mij, L , R , val );
update ( 2*nod+1 , mij + 1, dr, L , R, val );
if ( arb[ 2 * nod ].maxi == (mij-st+1) )
{
arb[nod].stanga = arb[ 2*nod ].maxi + arb[ 2 * nod + 1 ].stanga;
}
else
{
arb[nod].stanga = arb[2*nod].stanga;
}
if ( arb[ 2 * nod + 1 ].maxi == dr - mij )
{
arb[nod].dreapta = arb[ 2*nod+1 ].maxi +arb[2*nod].dreapta;
}
else
{
arb[nod].dreapta = arb[ 2*nod + 1].dreapta;
}
arb[nod].maxi = max( max ( arb[2*nod].maxi , arb[2*nod+1].maxi ), arb[2*nod].dreapta + arb[2*nod+1].stanga );
}
int main()
{
f>>n>>p;
update( 1 , 1 , n , 1 , n, 1 );
for ( i = 1; i <= p ; i++ )
{
f>>tip;
if ( tip == 3 )
{
g<<arb[1].maxi<<'\n';
continue;
}
f>>x>>y;
update( 1 , 1 , n , x , x+y-1, tip-1 );
}
return 0;
}