Cod sursa(job #240514)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 7 ianuarie 2009 19:54:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>   
#include <iostream.h>

#define IN "scmax.in"
#define OUT "scmax.out"
#define MAX 100003

int v[MAX],best[MAX],p[MAX],l[MAX];
int n,maxim,k,nr;

void afis(int);
int caut(int);

void afis(int i)
{
 if(p[i]>0)
  afis(p[i]);
    
 printf("%d ",v[i]);
}

int caut(int x)
{
 int p,u,m;
 
 p = 0; u = nr; m = (p+u)/2;
 
 while (p <= u)
 {
  if (v[l[m]] < x &&  v[l[m+1]] >= x) 
   return m;
  else
   if (v[l[m+1]] < x) 
   {
    p = m + 1;
    m = (p + u)/2;
   }
   else {u = m - 1; m = (p + u)/2;}
 }
 return nr;
}

int main()
{
   freopen(IN,"r",stdin);
   freopen(OUT,"w",stdout);
   
   int i,j,poz;
   nr = 1;

   scanf("%d",&n);
   for (i = 1; i <= n; i++)
    scanf("%d", v + i);
    
   best[1] = l[1] = 1;
   l[0] =  0;

   for (i = 2; i <= n; i++)
   {
    poz = caut(v[i]);
    p[i] = l[poz];
    best[i] = poz + 1;
    l[poz + 1] = i;
    
    if (nr < poz + 1)
     nr = poz + 1;
   }
   
   maxim = 0;
   poz = 0;
   
   for (i = 1; i <= n; i++)
    if (maxim < best[i])
    {
     maxim = best[i];
     poz = i;
    }
    
   printf("%d\n",maxim);
   afis(poz);
   
 return 0;   
}