Cod sursa(job #1516142)

Utilizator elevenstrArina Raileanu elevenstr Data 2 noiembrie 2015 19:21:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
long long int x[100050],l[100800],p[100000],sol[100005];
// p=indice predecesor element, l=indicele ultimului element de lungime i
int main()
{   long long int n,i,j,k,lnou,st,dr,med,L=0;
    in>>n;
    for(i=1;i<=n;i++)
       in>>x[i];
    L=0;
    for(i=1;i<=n;i++)
    { st=1;
      dr=L;
    while(st<=dr)
    {
        med=(st+dr)/2;
        if(x[l[med]]<x[i])
           st=med+1;
       else dr=med-1;
    }
    lnou=st; //lnou egal cu lmax in care ultimul element e mai mic decat x[i] ,+1 de la el. x[i];
     p[i]=l[lnou-1];
     l[lnou]=i;
     if(lnou>L)L=lnou;
    }
    k=l[L];
    out<<L<<'\n';
    for(i=L;i>=1;i--)
    {
        sol[i]=k;
        k=p[k];
    }

    for(i=1;i<=L;i++)
        out<<x[sol[i]]<<" ";



    return 0;
}