Cod sursa(job #1034425)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 17 noiembrie 2013 20:22:00
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
int x[100000],v[100000],p[100000],sol[100000];
int cautbin(int st,int dr,int val)
{
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(v[mij]>val)
            dr=mij-1;
        if(v[mij]<val)
            st=mij+1;
        if(v[mij]==val)
            return -1;
    }
    return st;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    int n;
    fscanf(fin,"%d",&n);
    int i,l=0;
    for(i=0; i<n; i++)
    {
        fscanf(fin,"%d",&x[i]);
        if(x[i]>v[l-1])
        {
            p[i]=l;
            v[l]=x[i];
            l++;
        }
        else
        {
            int pos=cautbin(0,l-1,x[i]);
            if(pos!=-1)
                v[pos]=x[i];
            p[i]=pos;
        }
    }
    fprintf(fout,"%d\n",l);
    int cont=n-1;
    for(i=l-1;i>=0;i--)
    {
        while(p[cont]!=i)
            cont--;
        sol[i]=x[cont];
    }
    for(i=0; i<l; i++)
        fprintf(fout,"%d ",sol[i]);
    return 0;
}