Cod sursa(job #256448)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 11 februarie 2009 19:13:49
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>   

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

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

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

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

int main()
{
 int i,j,poz;
 
 nr=1;

 fscanf(fin,"%d",&n);
 for(i=1;i<=n;i++)
  fscanf(fin,"%d",&v[i]);
 fclose(fin);

 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;
  }

 fprintf(fout,"%d\n",maxim);
 afis(poz);
 fclose(fout);

 return 0;
}

void afis(int i)
{
 if(p[i]>0)
  afis(p[i]);

 fprintf(fout,"%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;
}