Cod sursa(job #869610)

Utilizator TheNechizFMI Razvan Birisan TheNechiz Data 1 februarie 2013 20:49:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
# include <fstream>
using namespace std;
typedef int Vector[100003];

Vector v,e,poz,rez;
int N,lung; // Lungimea vectorului e
const int infinit = (1<<31);

void Citeste()
{
    ifstream in("scmax.in");
    int i;
    in >> N;
    for( i = 1 ; i <= N ; ++i )
        in >> v[i];
    in.close();
}

int Cauta( int x,int inf,int sup)
{
    int mij=(inf+sup)/2;

    if( inf == sup )
    {
        if( sup > lung ) e[++lung+1] = infinit;
        e[inf] = x;
        return inf;
    }
    else if( x <= e[mij] ) return Cauta(x,inf,mij);
        else return Cauta(x,mij+1,sup);
}

void Cp(void)
{
    int i;

    lung = 0; e[1] = 1;
    for( i = 1 ; i <= N ; ++i )
        poz[i] = Cauta(v[i],1,lung+1);
}

void Cs()
{
    int k=N,i;

    for( i = lung ; i ; --i ){
        while( poz[k] != i ) --k;
        rez[i] = v[k];
    }
}

void Tipar()
{
    ofstream out("scmax.out");
    int i;
    out << lung << '\n';
    for( i = 1 ; i <= lung ; ++i )
        out << rez[i] << ' ';
    out.close();
}

main()
{
    Citeste();
    Cp();
    Cs();
    Tipar();
}