Cod sursa(job #1700305)

Utilizator TincaMateiTinca Matei TincaMatei Data 9 mai 2016 23:42:07
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define MAX_N 100000
#define INFINIT 2000000001

int best[1+MAX_N];
int s[1+MAX_N];
int poz[1+MAX_N];
int last[1+MAX_N];
int v[MAX_N];
int rez[MAX_N];

int bin_search(int st, int dr, int val) {
  int mid;
  dr++;
  while(dr - st > 1) {
    mid = (st + dr) / 2;
    if(s[mid] < val)
      st = mid;
    else
      dr = mid;
  }
  return st;
}

int main() {
  int n, max, i, pozMax, j;
  FILE *fin = fopen("scmax.in", "r");
  fscanf(fin, "%d", &n);
  for(i = 0; i < n; i++) {
    s[i] = INFINIT;
    poz[i] = -1;
  }
  max = 0;
  pozMax = 0;
  for(i = 0; i < n; i++) {
    fscanf(fin, "%d", &v[i]);
    best[i] = bin_search(0 , max, v[i]) + 1;
    last[i] = poz[best[i] - 1];
    if(best[i] > max) {
      max = best[i];
      pozMax = i;
    }
    if(v[i] < s[best[i]]) {
      s[best[i]] = v[i];
      poz[best[i]] = i;
    }
  }
  fclose(fin);

  i = pozMax;
  j = max - 1;
  while(i > -1) {
    rez[j] = v[i];
    i = last[i];
    j--;
  }

  FILE *fout = fopen("scmax.out", "w");
  fprintf(fout, "%d\n", max);
  for(i = 0; i < max; i++)
    fprintf(fout, "%d ", rez[i]);
  fclose(fout);
  return 0;
}