Cod sursa(job #1245042)

Utilizator danny794Dan Danaila danny794 Data 18 octombrie 2014 15:58:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <cmath>

#define NMAX 100005

using namespace std;

int N, count, no[NMAX][2], L[NMAX], max;

int search(int number, int l, int r)
{
  if(l >= r)
  {
    if(number > no[L[r]][0])
      return r;
    return r-1;
  }

  int m = (l + r) >> 1;

  if(number > no[L[m]][0])
    return search(number, m + 1, r);
  else if(number < no[L[m]][0])
    return search(number, l, m - 1);
  else
    return m - 1;
}

int main() {
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
  scanf("%d", &N);
  for(int i = 1; i <= N; i++)
  {
    scanf("%d", &no[i][0]);
    int x = search(no[i][0], 0, max);

    no[i][1] = L[x];
    L[x+1] = i;
    if(x == max)
      max = x + 1;
  }

  printf("%d\n", max);
  int cur = L[max], i = max;
  while(cur)
  {
    L[i] = no[cur][0];
    i--;
    cur = no[cur][1];
  }

  for(int i = 1; i <= max; i++)
    printf("%d ", L[i]);
	return 0;
}