Cod sursa(job #1418995)

Utilizator felixiPuscasu Felix felixi Data 14 aprilie 2015 15:53:26
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>

using namespace std;

ifstream in("hotel.in");
ofstream out("hotel.out");

const int NMAX = 100000;

struct NOD {
    int mx, lf, rt;
};

NOD arb[4*NMAX+2];
int N, M;

///  Arbore
void Recalc( int nod, int L, int R ) {
    int fS = 2*nod, fD = 2*nod+1;
    arb[nod].lf = arb[fS].lf;
    if( arb[fS].lf == L )  arb[nod].lf = L + arb[fD].lf;

    arb[nod].rt = arb[fD].rt;
    if( arb[fD].rt == R )  arb[nod].rt = R + arb[fS].rt;

    arb[nod].mx = max( arb[fS].rt+arb[fD].lf , max(arb[fS].mx , arb[fD].mx) );
}

void Update_in( int nod, int st, int dr, int x, int y ) {
    if( st == dr ) {
        arb[nod].mx = arb[nod].lf = arb[nod].rt = 0;
        return ;
    }
    int mid = (st+dr) / 2, fS = 2*nod, fD = 2*nod+1;
    if( x <= mid )  Update_in( fS, st, mid, x,y );
    if( y > mid )   Update_in( fD, mid+1, dr, x,y );

    Recalc( nod, mid-st+1, dr-mid );
}

void Update_out( int nod, int st, int dr, int x, int y ) {
    if( st == dr ) {
        arb[nod].mx = arb[nod].lf = arb[nod].rt = 1;
        return ;
    }
    int mid = (st+dr) / 2, fS = 2*nod, fD = 2*nod+1;
    if( x <= mid )  Update_out( fS, st, mid, x,y );
    if( y > mid )   Update_out( fD, mid+1, dr, x,y );

    Recalc( nod, mid-st+1, dr-mid );
}

///  Operatii
void Oper_1() {
    int x,y,l;
    in >> x >> l;
    y = x + l - 1;
    Update_in( 1, 1,N, x,y );
}

void Oper_2() {
    int x,y,l;
    in >> x >> l;
    y = x + l - 1;
    Update_out( 1, 1,N, x,y );
}

void Oper_3() {
    out << arb[1].mx << '\n';
}

int main() {
    in >> N >> M;
    for( int i = 1;  i <= N;  ++i )  Update_out( 1, 1,N, i,i );

    for( int i = 1;  i <= M;  ++i ) {
        int OP;
        in >> OP;
        if( OP == 1 )  Oper_1();
        if( OP == 2 )  Oper_2();
        if( OP == 3 )  Oper_3();
    }
    return 0;
}