Cod sursa(job #1682390)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 10 aprilie 2016 11:24:01
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
int k;
int v[100001];
int l[100001];
int stiv[100001];
int find (int st, int dr,int val){
  int mij ;
  while (st <= dr){
    mij = (st+dr)/2;
    if (val <= stiv[mij])
      st = mij + 1;
    if (val > stiv[mij])
      dr = mij - 1;
  }
  return st;
}


int main (){
  FILE *in,*out;
  in = fopen ("scmax.in","r");
  out = fopen ("scmax.out","w");
  int n,i,k,lmax,poz;
  fscanf (in,"%d",&n);
  for (i=1;i<=n;i++)
    fscanf(in,"%d",&v[i]);

  l[n] = 1;
  lmax = 0;
  k = 1; stiv[k] = v[n];
  for (i=n-1;i>=1;i--){
    // cautare binara
    poz = find (1,k, v[i]);// de actualizat
    l[i] = poz;
    if (v[i] > stiv[poz])
      stiv[poz] = v[i];
    if (l[i] > lmax){
      lmax = l[i];
      k ++;
    }

  }

  fprintf (out,"%d\n",lmax);

  i = 1;
  int  j;
  for (j=lmax;j>=1;j--){
    while (l[i] != j)
      i ++;
    fprintf (out,"%d ",v[i]);
  }

  fclose (in);
  fclose (out);
  return 0;
}