Cod sursa(job #1339023)

Utilizator AndreiTimofteAndrei Timofte AndreiTimofte Data 10 februarie 2015 16:48:20
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#define IN "scmax.in"
#define OUT "scmax.out"
#define DMAX 100005

using namespace std;

ifstream fin (IN);
ofstream fout (OUT);

int A[DMAX], Best[DMAX], poz[DMAX], sol[DMAX];
int n, nr;

void citire()
{
    int i;

    fin>>n;
    for (i=1; i<=n; i++)
        fin>>A[i];
}

int cautare_binara(int x, int dim)
{
    int dr=dim+1, st=0, mij;

    while (dr-st>1)
    {
        mij=(st+dr)/2;

        if (Best[mij]>=x)   dr=mij;
        else                st=mij;
    }

    if (dr>dim)
        return 0;

    return dr;
}

void Dinamica()
{
    int i,  aux;

    nr=1;
    Best[1]=A[1]; poz[1]=1;
    for (i=2; i<=n; i++)
    {
        if (A[i] < Best[nr]) ///cautare binara
        {
            Best[cautare_binara(A[i], nr)]=A[i];
            poz[i]=cautare_binara(A[i], nr);
        }
        else
        {
            nr++;
            Best[nr]=A[i];
            poz[i]=nr;
        }
    }

}

void afisare()
{
    int i, aux=nr;

    for (i=n; i>=1; i--)
        if (poz[i]==aux)
            sol[aux--]=A[i];

    fout<<nr<<'\n';
    for (i=1; i<=nr; i++)
        fout<<sol[i]<<" ";
}

int main()
{
    citire();
    Dinamica();
    afisare();
    return 0;
}