Cod sursa(job #2506815)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 8 decembrie 2019 19:57:10
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define NMAX 100000

using namespace std;

struct elem {
  int val, index;
} best[NMAX + 5];;
int n, top;
int v[NMAX + 5], nr[NMAX + 5];

int bs(int x) {
  if(best[top].val < x)
    return top;
  int st, dr, mij, last = 0;

  st = 1;
  dr = top;
  while(st <= dr) {
    mij = (st + dr) / 2;
    if(best[mij].val < x) {
      last = mij;
      st = mij + 1;
    }
    else
      dr = mij - 1;
  }
  return last;
}

void find_path(int poz) {
  if(v[poz] == 0) {
    printf("%d ", nr[poz]);
    return;
  }
  find_path(v[poz]);
  printf("%d ", nr[poz]);
}

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

  scanf("%d", &n);
  for(int i = 1; i <= n; i++) {
    scanf("%d", &x);
    nr[i] = x;
    poz = bs(x);
    if(poz == top) {
      best[++top].val = x;
      best[top].index = i;
      v[i] = best[top - 1].index;
    }
    else {
      best[poz + 1].val = x;
      best[poz + 1].index = i;
      v[i] = best[poz].index;
    }
  }

  printf("%d\n", top);
  find_path(best[top].index);

  return 0;
}