Cod sursa(job #2501058)

Utilizator hunting_dogIrimia Alex hunting_dog Data 29 noiembrie 2019 00:59:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>
#define NMAX 100000

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int findPos(int *lcs,int *v,int l,int r,int x)
{
    if(l>r)
        return l;
    int m=(l+r)/2;
    if(v[lcs[m]]<x)
        return findPos(lcs,v,m+1,r,x);
    return findPos(lcs,v,l,m-1,x);
}

int main()
{
    int n,v[NMAX],lcs[NMAX],m=0,p[NMAX];;
    f>>n;
    for(int i=0;i<n;++i)
        {
            f>>v[i];
            p[i]=-1;
        }
    lcs[m++]=0;
    for(int i=1;i<n;++i)
    {
        int k=findPos(lcs,v,0,m-1,v[i]);
        if(k>0)
            p[i]=lcs[k-1];
        lcs[k]=i;
        if(k+1>m)
            m=k+1;
    }

    g<<m<<'\n';

    int res[NMAX],k=m;

    for(int i=lcs[m-1];i>=0;i=p[i])
        res[--m]=v[i];

    for(int i=0;i<k;++i)
        g<<res[i]<<' ';

    return 0;
}