Cod sursa(job #813217)

Utilizator tiriplica.mihaiMihai Tiriplica tiriplica.mihai Data 15 noiembrie 2012 01:04:56
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

#define MaxN 100000

int main(int argc, char* argv[]) {
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);

  int hoti[MaxN], l[MaxN] = { 0 }, poz[MaxN] = { 0 }, seq[MaxN];
  int n, i, max, start, p, u, j, m, length, s;

  scanf("%d", &n);
  for(i = 0; i < n; i++)
    scanf("%d", &hoti[i]);

  l[0] = hoti[0];
  poz[0] = 0;
  length = 1;
  start = n - 1;
  for(i = 1; i < n; i++) {
    /* caut locul elementului hoti[i] in vectorul l */
    j = -1;
    p = 0;
    u = length;
    m = (p + u) / 2;
    while(p <= u) {
      if((l[m] < hoti[i]) && (hoti[i] <= l[m + 1])) {
        j = m + 1;
        break;
      }
      else {
        if(l[m] >= hoti[i])
          u = m - 1;
        else
          if(l[m + 1] < hoti[i])
            p = m + 1;
      }
      m = (p + u) / 2;
    }

    if(hoti[i] <= l[0])
      j = 0;
    
    if(j != -1) {
      l[j] = hoti[i];
      poz[i] = j;
    }
    else {
      l[length] = hoti[i];
      poz[i] = length;
      length++;
    }
  }

  max = 0;
  start = 0;
  for(i = n - 1; i >= 0; i--)
    if(poz[i] == (length - 1)) {
      start = i;
      break;
    }

  printf("%d\n", length);
  s = start;
  seq[0] = hoti[s];
  m = 1;
  for(i = s; i >= 0; i--)
    if(poz[i] == (poz[start] - 1)) {
      start = i;
      seq[m++] = hoti[i];
    }
 
  for(i = m - 1; i >= 0; i--)
    printf("%d ", seq[i]);

  printf("\n"); 
  return 0;
}