Cod sursa(job #1559265)

Utilizator antanaAntonia Boca antana Data 30 decembrie 2015 15:14:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#define MAX 100000
using namespace std;
int v[MAX+1], best[MAX+1], secv[MAX+1], last[MAX+1];
int n, nr, maxim;
void afisare(int i)
{
    if(last[i]!=0) afisare(last[i]);
    printf("%d ", v[i]);
}
int cauta(int x)
{
    int st=0, dr=nr, mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[secv[mij]]<x&&v[secv[mij+1]]>=x)
            return mij;
        if(v[secv[mij]]<x)
            st=mij+1;
        else dr=mij-1;
    }
    return nr;
}
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int i, maxel;
    scanf("%d", &n);
    for(i=1;i<=n;i++)
        scanf("%d", &v[i]);
    nr=1;
    best[1]=1;
    secv[1]=1;
    for(i=2;i<=n;i++)
    {
        maxel=cauta(v[i]);
        best[i]=maxel+1;
        last[i]=secv[maxel];
        secv[maxel+1]=i;
        if(nr<maxel+1)
            nr=maxel+1;
    }
    maxim=-1;
    int poz;
    for(i=1;i<=n;i++)
    {
        if(best[i]>maxim)
        {
            maxim=best[i];
            poz=i;
        }
    }
    printf("%d\n", maxim);
    afisare(poz);
    return 0;
}