Cod sursa(job #3003952)

Utilizator Vincent47David Malutan Vincent47 Data 16 martie 2023 00:58:10
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <algorithm>

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

vector<int>  a, b, res, L, aib;
int n, lmax, N;

void update(int poz, int val)
{
    for (int i = poz; i <= N; i += i & -i)
        aib[i] = max(aib[i], val);
}

int query(int poz)
{
    int mx = 0;
    for (int i = poz; i; i -= i & -i)
        mx = max(mx, aib[i]);
    return mx;
}

int main()
{
    int h = 0;
    cin >> n;
    a = L = res = vector<int>(n + 1);
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    b = a;
    res = a;
    sort(b.begin(), b.end());
    vector<int> :: iterator it = unique(b.begin(), b.end());
    b.erase(it, b.end());

    N = b.size();
    aib = vector<int> (N + 1);

    for (int i = 0; i < n; ++i)
        a[i] = 1 + lower_bound(b.begin(), b.end(), a[i]) - b.begin();

    for (int i = 0; i < n; ++i)
    {
        L[i] = query(a[i] - 1) + 1;
        lmax = max(L[i], lmax);
        update(a[i], L[i]);
    }
    cout << lmax << '\n';
    for (int i = 1; i < n; ++i)
    {
        if (L[i] > L[i - 1])
            cout << res[i - 1] << ' ';
        if (L[i] == lmax){
            cout << res[i];
            break;
        }
    }

    return 0;
}