Cod sursa(job #1615396)

Utilizator RaduToporanRadu Toporan RaduToporan Data 26 februarie 2016 15:45:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

int n,k,i,a[100005],v[100005],tata[100005],poz,lmax,ult;

int cautare(int p, int u, int nr)
{
   while(p <= u){
    int mij = (p+u)/2;
    if(nr == a[v[mij]])
            return mij;
    if(nr<a[v[mij]])
        u = mij-1;
    else
        p = mij+1;
   }
   return p;
}
void afisare(int i)
{
    if(tata[i]!=0) afisare(tata[i]);
        printf("%d ",a[i]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);k=0;
    for( i = 1; i <= n; i++ )
    {
        scanf("%d",&a[i]);
        poz= cautare(1, k, a[i]);
        v[poz]=i;
        tata[i] =v[poz-1];
        if(poz>k)k++;
        if(poz>lmax)
        {
            lmax = poz;
            ult=i;
        }
    }
    printf("%d\n",lmax);
    afisare(ult);
    return 0;
}