Cod sursa(job #798300)

Utilizator crisjonycristi crisjony Data 16 octombrie 2012 09:17:46
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

FILE *fin,*fout;

long i,n,v[100002],b[100002],p[100002],l[100002],max,poz,nr;


int cautare(int x)
{
    int p, u, m;
    p = 0;
    u = nr;
    m = (p+u)/2;
    while (p <= u)
    {
        if ((v[l[m]] < x )&&(v[l[m+1]] >= x)) return m;
        else if (v[l[m+1]] < x)
        {
            p = m + 1;
            m = (p + u)/2;
        }
        else
        {
            u = m - 1;
            m = (p + u)/2;
        }
    }
    return nr;
}

void afisare(int i)
{
    if (p[i] > 0)
    {
        afisare(p[i]);
    }
    fprintf(fout,"%ld ",v[i]);
}

int main()
{
    fin=fopen("scmax.in","r");
    fscanf(fin,"%ld",&n);
    for(i=1; i<=n; i++)
    {
        fscanf(fin,"%ld",&v[i]);
    }
    b[1]=1;
    l[1]=1;
    l[0]=0;
    for(i=2; i<=n; i++)
    {
        poz=cautare(v[i]);
        p[i]=l[poz];
        b[i]=poz+1;
        l[poz+1]=i;
        if(nr<poz+1)
        {
            nr=poz+1;
        }
    }
    max=0;
    poz=0;
    for(i=1; i<=n; i++)
    {
        if (max<b[i])
        {
            max=b[i];
            poz=i;
        }
    }
    fout=fopen("scmax.out","w");
    fprintf(fout,"%ld\n",max);
    afisare(poz);
    return 0;
}