Cod sursa(job #1878711)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 14 februarie 2017 13:35:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#define nmax 100005

using namespace std;

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

int n,a[nmax],k[nmax],p[nmax],b[nmax],r;

void read()
{
    fin>>n;
    for(int i=0;i<n;i++)
        fin>>a[i];
}

void dinamica()
{
    int st,dr,m;
    p[0]=-1;
    k[0]=-1;
    r=1;
    for(int i=1;i<n;i++)
    {
        st=1;
        dr=r+1;
        while(st<dr)
        {
            m=(st+dr)/2;
            if(a[k[m]]<a[i])
                st=m+1;
            else
                dr=m;
        }
        k[st]=i;
        p[i]=k[st-1];
        if(st>r)
            r=r+1;
    }
}

void afisare()
{
    int j=k[r];
    for(int i=r-1;i>=0;i--)
    {
        b[i]=a[j];
        j=p[j];
    }
    fout<<r<<"\n";
    for(int i=0;i<r;i++)
        fout<<b[i]<<" ";
    fout<<"\n";
}

int main()
{
    read();
    dinamica();
    afisare();
    return 0;
}