Cod sursa(job #921584)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 21 martie 2013 09:08:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

int n, a[100001], dp[1000001], c[1000001];

int cotrobaie(int dr,int val)
{
    int st = 1,poz = dr+1;
    while(st<=dr)
    {
        int mij = (st+dr)/2;
        if(c[mij]>=val)
            dr = mij-1, poz = mij;
        else st = mij+1;
    }
    return poz;
}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    int dim = 1;
    c[1] = a[1];
    dp[1] = 1;
    for(int i=2;i<=n;i++)
    {

        int k = cotrobaie(dim,a[i]);
        if(k<=dim)
        {
            c[k] = a[i];
            dp[i] = k;
        }
        else
        {
            c[++dim] = a[i];
            dp[i] = dim;
        }
    }
    fout<<dim<<'\n';
    int aux = dim;
    for(int i = n;i>0;i--)
        if(dp[i] == dim )
        {
            c[dim--] = a[i];
        }
    for(int i=1;i<=aux;i++)
        fout<<c[i]<<' ';
    fin.close();
    fout.close();
    return 0;
}
 /*int st = 1,poz = dr+1;
    while(st<=dr)
    {
        int mij = (st+dr)/2;
        if(c[mij]>=val)
            dr = mij-1, poz = mij;
        else st = mij+1;
    }
    return poz;*/