Cod sursa(job #1523652)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 12 noiembrie 2015 22:23:40
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <cstdio>
using namespace std;
int a[100010],t[100010],l[100010],val[100010],indice[100010],m,n,k,v[100010],j=0;
FILE *f=fopen("scmax.in","r");
FILE *f1=fopen("scmax.out","w");
int caut_binar(int s, int d,int nr)
{
    if(s>d)
        return m;
    else
        {
         m =(s+d)/2;
            if(nr<val[m]&&nr>val[m-1])
                return m;
            if(nr<val[m-1])
                return caut_binar(s,m-1,nr);

            return caut_binar(m+1,d,nr);


        }
}
void scmax(int a[100010],int n)
{
    val[1]=a[1];
    l[1]=1;
    indice[1]=1;
    k=1;
    int nr;
    for(int i=2;i<=n;i++)
    {
        nr=a[i];
        if(nr>val[k])
        {
            val[++k]=nr;
            l[k]=l[k-1]+1;
            indice[k]=i;
            t[i]=indice[k-1];
        }
        else
        {
            int c=caut_binar(1,k,nr);
            val[c]=nr;
            indice[c]=i;
            t[i]=indice[k-1];
        }

    }
}
void restoration( )
{
    int i=indice[k];

    while(i)
    {
       v[++j]=a[i];
       i=t[i];
    }
    for(i=j;i>=1;i--)
        fprintf(f1,"%d ",v[i]);
}
int main()
{
    int n,i;

    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
    }
   scmax(a,n);

   fprintf(f1,"%d\n",l[k]);
   restoration( );
    return 0;
}