Cod sursa(job #1783552)

Utilizator BarbumateiBarbu Matei Barbumatei Data 19 octombrie 2016 09:28:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia3-programaredinamica1 Marime 0.68 kb
#include <stdio.h>
#include <stdlib.h>
int v[100001], q[100001], p[100001], lmax;
int main(){
  int n, i, st, dr, mij;
  FILE *fin, *fout;
  fin=fopen("scmax.in", "r");
  fout=fopen("scmax.out", "w");
  fscanf(fin, "%d", &n);
  for(i=1; i<=n; i++){
    fscanf(fin, "%d", &v[i]);
    st=1; dr=lmax;
    while(st<=dr){
      mij=(st+dr)/2;
      if(v[i]<q[mij]) dr=mij-1;
      else st=mij+1;
    }
    if(q[st-1]!=v[i]){
      lmax+=(st>lmax);
      q[st]=v[i];
      p[i]=st;
    }
  }
  fprintf(fout, "%d\n", lmax);
  dr=n;
  for(i=lmax; i; i--){
    while(p[dr]!=i) dr--;
    q[i]=v[dr];
  }
  for(i=1; i<=lmax; i++)
    fprintf(fout, "%d ", q[i]);
  fclose(fin);
  fclose(fout);
    return 0;
}