Cod sursa(job #1498358)

Utilizator Julian.FMI Caluian Iulian Julian. Data 8 octombrie 2015 14:57:42
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

long nr,p[nmax],v[nmax],l[nmax],best[nmax];

void afisare(long poz)
{
    if(p[poz])
        afisare(p[poz]);
    fout<<v[poz]<<' ';
}


long cauta(long x)
{   long  s=0,d=nr,m;
    while(s<=d)
    {m=(s+d)/2;
    if(v[l[m]]<x && x<=v[l[m+1]])return m;
        else if(x>v[l[m+1]])s=m+1;
        else d=m-1;
    }
    return nr;
}

int main()
{long n,i,poz;
    nr=1;
    fin>>n;
    for(i=1;i<=n;i++)fin>>v[i];
    best[1]=l[1]=1;
    l[0]=0;

    for(i=2;i<=n;i++)
    {
        poz=cauta(v[i]);
        p[i]=l[poz];
        best[i]=poz+1;
        l[poz+1]=i;
        if(poz+1>nr)nr=poz+1;
    }
    long maxim;
    maxim=best[1];poz=1;
    for(i=2;i<=n;i++)
        if(maxim<best[i])
    {
        maxim=best[i];poz=i;
    }

    fout<<maxim<<'\n';
    afisare(poz);
}