Cod sursa(job #886693)

Utilizator ionut_ungureanuUngureanu Vladut Ionut ionut_ungureanu Data 23 februarie 2013 10:01:05
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#define FIN "scmax.in","r",stdin
#define FOUT "scmax.out","w",stdout

using namespace std;

int n,i,pos,lg,j;
int a[100001],bst[100001],poz[100001],sol[100001];

int search(int x)
{
    int p=1,u=lg,m;
    while(p<=u)
    {
        m=(p+u)/2;
        if(bst[m]>=x && bst[m-1]<x)return m;
        if(bst[m-1]<x)p=m+1;
        else u=m-1;
    }
    return ++lg;
}

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


int main()
{
    freopen(FIN);
    freopen(FOUT);
    scanf("%d",&n);
    for(i=1;i<=n;i++){scanf("%d",&a[i]);bst[i]=2000000000;}
    bst[0]=-1;
    for(i=1;i<=n;i++)
    {
        pos=search(a[i]);
        bst[pos]=a[i];
        poz[i]=pos;
    }
printf("%d\n",lg);

pos=n;
for(i=lg;i>0;i--)
{
    while(poz[pos]!=i)pos--;
    sol[i]=a[pos];
}
for(i=1;i<=lg;i++)printf("%d ",bst[i]);
//for(i=1;i<=lg;i++)printf("%d ",sol[i]);

    return 0;
}