Cod sursa(job #1650398)

Utilizator EberardoVladianu Cosmin Eberardo Data 11 martie 2016 18:06:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int best[100002],m[100002];
int tata[100002];
int indice[100002];
int n,v[100002];

int lmax=0,poz;

void citire()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
}

int cautare_binara(int poz1, int poz2,int valoare)
{
    int mi;

    while(poz1<=poz2)
    {
        mi=(poz1+poz2)/2;
        if(best[mi]>=valoare)
        {
            poz2=mi-1;
        }
        else
            poz1=mi+1;
    }
    return poz1;
}

void reconstituire(int pozitie)
{
    if(pozitie!=0)
    {
        reconstituire(tata[pozitie]);
        fout<<v[pozitie]<<' ';
    }
}

void rezolvare()
{
    int i;
    int pozitie;
    for(i=1;i<=n;i++)
    {
        m[i]=cautare_binara(1,lmax,v[i]);
        best[m[i]]=v[i];
        indice[m[i]]=i;
        tata[i]=indice[m[i]-1];
        if(m[i]>lmax)
        {
            lmax=m[i];
            poz=i;
        }
    }
    fout<<lmax<<'\n';
    reconstituire(poz);
}

int main()
{
    citire();
    rezolvare();
    return 0;
}