Cod sursa(job #2234909)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 26 august 2018 12:15:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <stack>

using namespace std;

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

const int MAXN = 1e5;
const int MAXVAL = 2e9;
const int INF = 2e9 + 1;

int v[MAXN + 1];
pair<int, int> len[MAXN + 1];
int n, dp[MAXN + 1], ant[MAXN + 1];

int cb(int val) {
  int ret = 0, add = 1 << 20;
  while (add) {
    if (ret + add <= n && len[ret + add].first < val) ret += add;
    add >>= 1;
  }
  return ret;
}

int main() {
  in >> n;

  for (int i = 1; i <= n; ++ i) {
    in >> v[i];
    len[i].first = INF;
  }

  int maxVal = 0, maxPoz;
  for (int i = 1; i <= n; ++ i) {
    int cnt = cb(v[i]);
    dp[i] = cnt + 1;
    if (maxVal < dp[i]) {
      maxVal = dp[i];
      maxPoz = i;
    }
    len[cnt + 1].first = v[i];
    len[cnt + 1].second = i;
    ant[i] = len[cnt].second;
  }

  stack<int> stiva;
  int cur = maxPoz;
  stiva.push(v[cur]);
  while (ant[cur]) {
    cur = ant[cur];
    stiva.push(v[cur]);
  }

  out << maxVal << '\n';
  while (stiva.size()) {
    out << stiva.top() << ' ';
    stiva.pop();
  }

  return 0;
}