Cod sursa(job #2090792)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 18 decembrie 2017 18:53:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMax = 1e5 + 3;

int v[NMax], best[NMax], p[NMax], maxim, k, L[NMax], nr;
int n;

void afis(int i)
{
  if(p[i] > 0)
    afis(p[i]);
  fout << v[i] << " ";
} 

int caut(int x)
{
  int p, u, m;
  p = 0;
  u = nr;
  m = (p + u) / 2;

  while(p <= u) {
    if(v[L[m]] < x && v[L[m + 1]] >= x)
      return m;
    else
      if(v[L[m + 1]] < x) {
        p = m + 1;
        m = (p + u) / 2;
      }
      else {
        u = m - 1;
        m = (p + u) / 2;
      } 
  }

  return nr;
} 

int main()
{ 
  int i, j, poz;
  nr = 1;

  fin >> n;
  for(i = 1; i <= n; ++i)
    fin >> v[i];
  best[1] = L[1] = 1;
  L[0] = 0;

  for(i = 2; i <= n; ++i) {
    poz = caut(v[i]);
    p[i] = L[poz];
    best[i] = poz + 1;
    L[poz + 1] = i;
    if(nr < poz + 1)
      nr = poz + 1;
  } 
  
  maxim = 0; poz = 0;
  for(i = 1; i <= n; ++i)
    if(best[i] > maxim) {
      maxim = best[i];
      poz = i;
    }
 
  fout << maxim << endl;
  afis(poz);
  
  return 0;
}