Cod sursa(job #2245669)

Utilizator xtreme77Patrick Sava xtreme77 Data 25 septembrie 2018 18:43:53
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");

const int MAX = 1e5 + 14;
int v [MAX];
int dp [MAX];
int pos [MAX];
int lst [MAX];
int main() {
    int n;
    cin >> n ;
    for (int i = 1; i <= n; ++ i)
        cin >> v [i];
    int bestDp = 0;
    for (int i = 1; i <= n; ++ i)
    {
        int st = 1;
        int dr = bestDp;
        int sol = 0;
        while (st <= dr)
        {
            int mij = (st + dr) >> 1;
            if (dp [mij] <= v [i])
            {
                sol = mij;
                st = mij + 1;
            }
            else
            {
                dr = mij - 1;
            }
        }
        dp [sol + 1] = v [i];
        pos [sol + 1] = i;
        lst [i] = pos [sol];
        bestDp = max (bestDp, sol + 1);
    }
    cout << bestDp << '\n';
    vector <int> sol;
    int cur = pos [bestDp];
    while (cur)
    {
        sol.push_back(cur);
        cur = lst [cur];
    }
    while (sol.size()) {
        cout << v[sol.back()] << ' ';
        sol.pop_back();
    }
    return 0;
}