Mai intai trebuie sa te autentifici.

Cod sursa(job #1523908)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 13 noiembrie 2015 14:27:24
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <cstdio>
# include <vector>

using namespace std;
int a[100010],t[100010],l[100010],val[100010];
int indice[100010],k;

FILE *f=fopen("scmax.in","r");
FILE *f1=fopen("scmax.out","w");

int caut_binar(int s, int d,int nr)
{
    int m;
    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];
    int q=0;
    while(i)
    {
       val[++q]=a[i];
       i=t[i];
    }
    for(i=q;i>=1;i--)
           fprintf(f1,"%d ",val[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;
}