Cod sursa(job #1860727)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 28 ianuarie 2017 12:36:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>

using namespace std;
int n,nr,i,j,poz,maxim;
int a[100002],L[100002],P[100002],best[100002];

int q(int x)
{
    int p=0,u=nr,m;
    m=(p+u)/2;
    while(p<=u)
    {
        if(a[L[m]]<x&&a[L[m+1]]>=x)return m;
        else if(a[L[m+1]]<x)
        {
            p=m+1;
            m=(p+u)/2;
        }
        else
        {
            u=m-1;
            m=(p+u)/2;
        }
    }
    return nr;
}

void afis(int i)
{
   if(P[i]>0) afis(P[i]);
   printf("%d ",a[i]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    L[1]=best[1]=1;
    L[0]=0;
    nr=1;
    for(i=2;i<=n;i++)
    {
        poz=q(a[i]);
        P[i]=L[poz];
        best[i]=poz+1;
        L[poz+1]=i;
        if(nr<poz+1)
            nr=poz+1;
    }
    maxim=poz=0;
    for(i=1;i<=n;i++)
        if(maxim<best[i])
        maxim=best[i],poz=i;
    printf("%d\n",maxim);

    afis(poz);

    return 0;
}