Cod sursa(job #2212917)

Utilizator PetyAlexandru Peticaru Pety Data 15 iunie 2018 11:34:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100002;

int v[NMAX], aib[NMAX], d[NMAX], cp[NMAX], sol[NMAX], last[NMAX], n, k;

int cautare_binara (int x) {
  int st = 1, dr = k, rez;
  while (st <= dr) {
    int mij = (st + dr) / 2;
    if (d[mij] <= x) {
      st = mij + 1;
      rez = mij;
    }
    else
      dr = mij - 1;
  }
  return rez;

}

int query (int x) {
  int ind = 0;
  for (; x; x -= (x & -x))
    if (sol[ind] < sol[aib[x]])
      ind = aib[x];
  return ind;
}

void update (int x, int i) {
  for (; x <= n; x += (x & -x))
    if (sol[i] > sol[aib[x]])
      aib[x] = i;
}

void afisare (int poz) {
  if (poz > 0) {
    afisare(last[poz]);
    fout << cp[poz] << " ";
  }
}

int main()
{
  fin >> n;
  for (int i = 1; i <= n; i++) {
    fin >> v[i];
    d[i] = cp[i] = v[i];
  }
  sort (d + 1, d + n + 1);
  for (int i = 1; i <= n; i++)
    if (d[i] != d[k])
      d[++k] = d[i];
  for (int i = 1; i <= n; i++)
    v[i] = cautare_binara(v[i]);
  for (int i = 1; i <= n; i++) {
    last[i] = query(v[i] - 1);
    sol[i] = sol[last[i]] + 1;
    update(v[i], i);
  }
  int poz = 0;
  for (int i = 1; i <= n; i++)  {
    if (sol[poz] < sol[i])
      poz = i;
  }
  fout << sol[poz] << "\n";
  afisare(poz);
  return 0;
}