Cod sursa(job #930579)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 27 martie 2013 18:45:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
inline int max(int a , int b)
{
    if(a > b)
        return a;
    return b;
}
int v[100001] , a[100001] , best[100001] , sol[100001];
int n , poz , maxim;
int cb(int val)
{
    int st=1 , dr=v[0] , med;
    while(st < dr)
    {
        med=(st + dr) >> 1;
        if(v[med] < val)
            st=med + 1;
        else
            dr=med;
    }
    return st;
}
int main()
{
    freopen("scmax.in" , "r" , stdin);
    freopen("scmax.out" , "w" , stdout);
    scanf("%d" , &n);
    for (int i=1 ; i<=n ; ++i)
        scanf("%d" , &a[i]);
    v[1]=a[1];
    v[0]=1;
    best[1]=1;
    maxim=1;
    if(v[1] < a[2])
    {
        v[++v[0]]=a[2];
        best[2]=2;
        maxim=2;
    }
    for (int i=2 ; i<=n ; ++i)
    {
        poz=cb(a[i]);
        v[poz]=a[i];
        best[i]=poz;
        maxim=max(maxim , best[i]);
        v[0]=max(v[0] , poz + 1);
        //printf("%d " , best[i]);
    }
    printf("%d\n" , maxim);
    for (int i=n ; i>=1 && maxim >= 0 ; --i)
        if(best[i] == maxim)
        {
            sol[++sol[0]]=a[i];
            --maxim;
        }
    for (int i=sol[0] ; i>=1 ; --i)
        printf("%d " , sol[i]);
    return 0;
}