Cod sursa(job #1947183)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 30 martie 2017 20:05:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> best,v,l,pre;
int n,nr;
void afiseaza(int k)
{
    if(pre[k]) afiseaza(pre[k]);
    g<<v[k]<<' ';
}
int caut_bin(int x)
{
    int p=0,u=nr,m=(p+u)/2;
    while(p<=u)
    {
        if(v[l[m]]<x && v[l[m+1]]>=x) return m;
        else if(v[l[m+1]]<x){p=m+1; m=(p+u)/2;}
        else {u=m-1;m=(p+u)/2;}
    }
    return nr;
}
int main()
{
    f>>n;
    best.resize(n+1);
    v.resize(n+1);
    l.resize(n+1);
    pre.resize(n+1);
    for(int i=1; i<=n; i++) f>>v[i];
    best[1]=l[1]=1;l[0]=0;nr=1;
    for(int i=2;i<=n;i++)
        {
            int pos=caut_bin(v[i]);
            best[i]=pos+1;
            l[pos+1]=i;
            pre[i]=l[pos];
            if(pos+1>nr) nr=pos+1;
        }
    g<<nr<<'\n';
    afiseaza(l[nr]);
    return 0;
}