Cod sursa(job #2267040)

Utilizator anghelus_vladAnghelus Ionut Vlad anghelus_vlad Data 23 octombrie 2018 10:30:08
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#define NMAX 100003

using namespace std;

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

int n, lgbest;
int poz[NMAX], a[NMAX], best[NMAX], sol[NMAX];

void citire()
{
    int i;

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

void cautare_binara(int k, int i)
{
    int st, dr, mij;

    st=1; dr=lgbest;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(best[mij]>k)
            dr=mij-1;
        else
            st=mij+1;
    }
    best[mij]=k; poz[i]=mij;
}

void pd()
{
    int i;

    best[lgbest=1]=a[1]; poz[1]=1;
    for(i=2; i<=n; ++i)
    {
        if(a[i]>best[lgbest])
        {
            best[++lgbest]=a[i];
            poz[i]=lgbest;
        }
        else
            cautare_binara(a[i], i);
    }
}

void afisare()
{
    int i, j=0;

    fout << lgbest << '\n';
    for(i=n; i>=1; --i)
        if(poz[i]==lgbest && lgbest!=0)
        {
            sol[++j]=a[i];
            lgbest--;
        }
    for(i=j; i>=1; --i)
        fout << sol[i] << ' ';
}

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