Cod sursa(job #676679)

Utilizator AplayLazar Laurentiu Aplay Data 9 februarie 2012 15:15:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
const int inf= 1<<30;
int n,a[100001],l[100001],p[100001];
FILE *g=fopen("scmax.out","w");

void citire()
{
    FILE*f=fopen("scmax.in","r");
    fscanf(f,"%d",&n);
    for(int i=1;i<=n;++i)
        fscanf(f,"%d",&a[i]);
    fclose(f);
}

int binara(int st,int dr,int val)
{
    while(st<dr)
    {
        int m=(st+dr)/2;
        if(l[m]<val)
            st=m+1;
        else dr=m;
    }

    return st;
}

int scmax()
{
    int lg=0;
    for(int i=1;i<=n;++i)
    {
        l[i]=inf;
        int k=binara(1,lg+1,a[i]);

        if(l[k]==inf)
            ++lg;

        l[k]=a[i];
        p[i]=k;
    }
    return lg;
}

void reconstr(int n,int val)
{
    for(int i=n;i>0;--i)
        if(p[i]==val)
        {
            reconstr(i-1,val-1);
            fprintf(g,"%d ",a[i]);
            break;
        }
}

int main()
{
    citire();
    int sol=scmax();
    fprintf(g,"%d\n",sol);
    reconstr(n,sol);
    fclose(g);
    return 0;
}