Cod sursa(job #2695182)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 12 ianuarie 2021 00:12:45
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100000

int v[NMAX], ind[NMAX], pred[NMAX], out[NMAX];

int cautare(int e, int n){
  int min, max, mij;
  min = 0;
  max = n;
  while((max - min) > 1){
    mij = (min + max) / 2;
    if(e < v[ind[mij]]){
      max = mij;
    }else{
      min = mij;
    }
  }
  return min;
}

int main()
{
    FILE *fin, *fout;
    int n, i, j, lim, retval;
    fin = fopen("scmax.in", "r");
    fscanf(fin, "%d", &n);
    for(i = 0; i < n; i++){
      pred[i] = -1;
    }
    lim = 0;
    for(i = 0; i < n; i++){
      fscanf(fin, "%d", &v[i]);
      retval = cautare(v[i], lim);
      if(v[i] <= v[ind[retval]]){
        retval--;
      }
      ind[retval + 1] = i;
      if(lim == (retval + 1)){
        lim++;
      }
      if(0 <= retval){
        pred[i] = ind[retval];
      }
    }
    fclose(fin);
    fout = fopen("scmax.out", "w");
    fprintf(fout, "%d\n", lim);
    i = ind[lim - 1];
    j = lim - 1;
    while(-1 < i){
      out[j] = v[i];
      j--;
      i = pred[i];
    }
    for(j = 0; j < lim; j++){
      fprintf(fout, "%d ", out[j]);
    }
    fclose(fout);
    return 0;
}