Cod sursa(job #1089072)

Utilizator dragosaioaneiAioanei Dragos dragosaioanei Data 21 ianuarie 2014 14:44:00
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define IN "scmax.in"
#define OUT "scmax.out"
#define NMAX 100005

FILE * fin=fopen(IN,"r");
FILE * fout=fopen(OUT,"w");

int best[NMAX],poz[NMAX],sir[NMAX],a[NMAX];
int st,dr,mij,lgmax,i,k,n,x;

int cautare_binara();
int main()
{
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(fin,"%d",&a[i]);
    for(i=1;i<=n;i++)
    {
        if(a[i]>=best[k])
        {
            best[++k]=a[i];
            poz[i]=k;
        }
        else
        {
            x=cautare_binara();
            best[x]=a[i];
            poz[i]=x;
        }
    }
    lgmax=k;
    for(i=n;i>=1;i--)
    {
        if(poz[i]==lgmax)
        {
            sir[lgmax]=a[i];
            lgmax--;
        }
    }
    fprintf(fout,"%d\n",k);
    for(i=1;i<=k;i++)
        fprintf(fout,"%d ",sir[i]);
}

int cautare_binara()
{
    int pozitie;
    st=0; dr=k+1;
    while(dr-st>1)
    {
        mij=st+(dr-st)/2;
        if(a[i]<best[mij])
        {
            pozitie=mij;
            dr=mij;
        }
        else
        {
            st=mij;
        }
    }
    return pozitie;
}