Cod sursa(job #1523670)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 12 noiembrie 2015 22:39:06
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 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;
}