Cod sursa(job #218982)

Utilizator pikuAnca Miihai piku Data 4 noiembrie 2008 17:13:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<cstdio>

int n, lc, v[100000], prev[100000], c[100000];

int bsearch(int x)
{
  int l = 0, r = lc - 1, m;
  while(l <= r)
  {
    m = l + (r - l)/2;
    if(v[c[m]] == v[x])
      return m;
    if(v[x] < v[c[m]])
      r = m - 1;
    else
      l = m + 1;
//    else

  }
  return m;
}

void print(int x)
{
  if(x < 0)
    return;
  print(prev[x]);
  printf("%d ", v[x]);
}

int main()
{
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);

  scanf("%d", &n);
  int i, cur;
  
  for(i = 0; i < n; ++i)
  {
    scanf("%d", &v[i]); 
    prev[i] = -1;
  }
  
  lc = 1; c[0] = 0;
  for(i = 1; i < n; ++i)
  {
    cur = bsearch(i);
    
    if(v[i] <= v[c[cur]] )
    {
      c[cur] = i;
      prev[i] = (cur == 0 ? -1 : c[cur-1]);
    }
    else
    {
      c[cur+1] = i;
      prev[i] = c[cur];
      if(cur == lc - 1)
        ++lc;
    }
  }
  
  printf("%d\n", lc);
  print(c[lc-1]);
    
  return 0;
}