Cod sursa(job #1274113)

Utilizator refugiatBoni Daniel Stefan refugiat Data 23 noiembrie 2014 12:54:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<stdio.h>
const int nmax=1000000;
const int inf=2000000000;
int minim[nmax+1],v[nmax+1],t[nmax+1],minpoz[nmax+1];
inline int cautb(int x)
{
    int st=0,dr=nmax,med;
    while(st<=dr)
    {
        med=(st+dr)>>1;
        if(minim[med]>=x)
            dr=med-1;
        else
            st=med+1;
    }
    return st;
}
void afis(int poz)
{
    if(t[poz]!=0)
        afis(t[poz]);
    printf("%d ",v[poz]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n;
    scanf("%d",&n);
    int i;
    for(i=1;i<=nmax;++i)
        minim[i]=inf;
    int x,lmax=0,pmax;
    for(i=1;i<=n;++i)
    {
        scanf("%d",&v[i]);
        int poz=cautb(v[i]);
        t[i]=minpoz[poz-1];
        minim[poz]=v[i];
        minpoz[poz]=i;
        if(poz>lmax)
        {
            lmax=poz;
            pmax=i;
        }
    }

    printf("%d\n",lmax);
    afis(pmax);
}