Cod sursa(job #894109)

Utilizator gabriel93Robu Gabriel gabriel93 Data 26 februarie 2013 19:45:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#define Nmax 100002
using namespace std;
int n;
int a[Nmax],b[Nmax],l[Nmax],pos[Nmax];

void citire()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        scanf("%d",&a[i]);
}

int caut(int x,int lm)
{
    int p,u,m;
    p=0;
    u=lm;
    while(p<=u)
    {
        m=p+((u-p)>>1);
        if(a[l[m]] < a[x] && a[l[m+1]] >= a[x])
            return m;
        if(a[l[m+1]] < a[x])
            p=m+1;
        else
            u=m-1;
    }
    return lm;
}

void scrie(int x)
{
    if(pos[x]>0)
        scrie(pos[x]);
    printf("%d ",a[x]);
}

void rezolv()
{
    int i,p,lm,maxim;
    b[1]=1;
    l[1]=1;
    lm=1;
    for(i=2;i<=n;++i)
    {
        p=caut(i,lm);
        pos[i]=l[p];
        b[i]=p+1;
        l[p+1]=i;
        if(lm<p+1)
            lm=p+1;
    }
    maxim=0; p=0;
    for(i=1;i<=n;++i)
        if(maxim < b[i])
        {
            maxim=b[i];
            p=i;
        }
    printf("%d\n",maxim);
    scrie(p);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    rezolv();
    fclose(stdin);
    fclose(stdout);
    return 0;
}