Cod sursa(job #253172)

Utilizator katakunaCazacu Alexandru katakuna Data 5 februarie 2009 15:14:31
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<algorithm>
#define NMAX 100011
#define INF 1<<30
using namespace std;

int imax,lmax,n,x[NMAX],i,j,t[NMAX],bst[NMAX],v[NMAX];

FILE *g=fopen("scmax.out","w");

int cauta(int X){
   int p=1,u=lmax,mij;

   while(p <= u){
      mij=(p+u)>>1;
      if(v[x[mij]] >= X)
         u=mij-1;

      else
         p=mij+1;
   }

   return u;
}

void af(int i){
   i=t[i];
   if(i != 0){
      af(i);
      fprintf(g,"%d ",v[i]);
   }
}

int main(){

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

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

  for(i=1; i<=n; i++)
     x[i] = INF;

  x[1]=1;
  bst[1]=1;
  lmax=1;

  for(i=2; i<=n; i++){
     bst[i] = cauta(v[i]) + 1;
     t[i] = x[bst[i] - 1];

     if(bst[i] > lmax){
        lmax = bst[i];
        imax = i;
     }

     if(v[x[bst[i]]] > v[i] || x[bst[i]] == INF)
     x[bst[i]] = i;
  }

  fprintf(g,"%d\n",lmax);
  af(imax);
  fprintf(g,"%d",v[imax]);

  fclose(f);
  fclose(g);

  return 0;
}