Cod sursa(job #433328)

Utilizator mihaionlyMihai Jiplea mihaionly Data 3 aprilie 2010 16:15:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
using namespace std;
#define nmax 100005
int V[nmax],L[nmax],pre[nmax],k,n;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
void read()
 {
 fscanf(f,"%d",&n);
 int i;
 for(i=1;i<=n;i++)
  fscanf(f,"%d",&V[i]);
 }
void afis(int x)
 {
 if(pre[x]>0) afis(pre[x]);
 fprintf(g,"%d ",V[x]);
 }
int caut(int x)
 {
 int st,dr,m;
 st=1;
 dr=k;
 m=(st+dr)>>1;
 while(st<=dr)
  {
  if(V[L[m]]<x && (V[L[m+1]]>=x||m+1>k)) return m;
  if(V[L[m]]>x)
   dr=m-1;
  else
   st=m+1;
  m=(st+dr)>>1;
  }
 return 0;
 }
int main()
 {
 read();
 int i,poz;
 L[1]=1;
 L[++k]=1;
 for(i=2;i<=n;i++)
  {
  poz=caut(V[i]);
  L[poz+1]=i;
  pre[i]=L[poz];
  if(poz+1>k)
   k=poz+1;
  }
 fprintf(g,"%d\n",k);
 afis(L[k]);
 return 0;
 }