Cod sursa(job #2571865)

Utilizator DariusDCDarius Capolna DariusDC Data 5 martie 2020 10:31:10
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 100005;
int n;
int a[nmax];
int pos[nmax], dp[nmax], tt[nmax];

inline int cb(int k, int x)
{
    int st = 1;
    int dr = k;
    while (st <= dr)
    {
        int mij = (st+dr)/2;
        if (a[pos[mij]] < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return st;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> a[i];
    int l, p;
    l = 1;
    tt[1] = 0;
    pos[1] = 1;
    int maxim = 0;
    int p1;
    for (int i = 2; i <= n;i++)
    {
        p = cb(l, a[i]);
        l = max(l, p);
        pos[p] = i;
        dp[i] = l;
        tt[i] = p;
        if (l > maxim)
            maxim = l, p1 = i;
    }
    fout << maxim << "\n";
    stack <int> ans;
    for (int i = maxim; maxim; maxim--, i = tt[i])
        ans.push(a[pos[i]]);
    while (!ans.empty())
        fout << ans.top() << " ", ans.pop();
    return 0;
}