Cod sursa(job #858508)

Utilizator danalex97Dan H Alexandru danalex97 Data 18 ianuarie 2013 22:39:56
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#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';
    }
}