Cod sursa(job #2499918)

Utilizator hunting_dogIrimia Alex hunting_dog Data 26 noiembrie 2019 22:33:37
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>

#define NMAX 100000

using namespace std;

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

int findPos(int *v,int *lis,int l,int r,int x)
{
    while(r-l>1)
    {
        int m=l+(r-l)/2;
        if(v[lis[m]]>=x)
            r=m;
        else
            l=m;

    }
    return l+1;

}

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

    lis[0]=0;

    for(int i=1;i<n;++i)
    {
        if(v[i]>v[lis[m]])
            lis[++m]=i,p[i]=lis[m-1];
        else if(v[i]!=v[lis[0]])
            if(v[i]<v[lis[0]])
                lis[0]=i,p[i]=-1;
            else
            {
                int k=findPos(v,lis,0,m,v[i]);
                lis[k]=i;
                p[i]=lis[k-1];
            }
    }

    g<<m+1<<'\n';
    for(int i=1;i<=m;++i)
        g<<v[p[lis[i]]]<<' ';
    g<<v[lis[m]];

    return 0;

}