Cod sursa(job #2373533)

Utilizator cella.florescuCella Florescu cella.florescu Data 7 martie 2019 13:58:50
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

int dp[MAXN + 1], v[MAXN + 1], prv[MAXN + 1];

int main()
{
    int n;
    ifstream fin("scmax.in");
    fin >> n;
    for (int i = 1; i <= n; ++i)
      fin >> v[i];
    fin.close();
    int len = 1;
    dp[1] = 1;
    for (int i = 2; i <= n; ++i) {
      int ans = 0;
      for (int step = 1 << 16; step > 0; step >>= 1)
        if (ans + step <= len && v[dp[ans + step]] < v[i])
          ans += step;
      prv[i] = dp[ans];
      dp[ans + 1] = i;
      len += (ans == len);
    }
    vector < int > sol;
    int p = dp[len];
    while (p > 0) {
      sol.push_back(v[p]);
      p = prv[p];
    }
    reverse(sol.begin(), sol.end());
    ofstream fout("scmax.out");
    fout << len << '\n';
    for (auto it : sol)
      fout << it << " ";
    fout.close();
    return 0;
}