Cod sursa(job #2462297)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 26 septembrie 2019 23:51:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define N 100000
#define inf 2000000010

using namespace std;

int n, a[N + 10];
int gr[N + 10];
int backpos[N + 10];
int grpos[N + 10];

int cautbin(int val)
{
    int res = -1;
    int l = 0, r = N - 1, m;
    while(l <= r)
    {
        m = (l + r) / 2;
        if(gr[m] >= val)
        {
            res = m;
            r = m - 1;
        }
        else
        {
            l = m + 1;
        }
    }
    return res;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    gr[0] = -inf;
    for(int i = 1; i <= N; i++)
        gr[i] = inf;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    grpos[0] = -1;
    int maxgr = 0;
    for(int i = 0; i < n; i++)
    {
        int newpos = cautbin(a[i]);
        maxgr = max(maxgr, newpos);
        backpos[i] = grpos[newpos - 1];
        gr[newpos] = a[i];
        grpos[newpos] = i;
    }
    vector<int> result;
    result.reserve(maxgr);
    int pos = grpos[maxgr];
    while(pos != -1)
    {
        result.push_back(a[pos]);
        pos = backpos[pos];
    }
    cout << maxgr << '\n';
    for(int i = result.size() - 1; i >= 0; i--)
        cout << result[i] << ' ';
    return 0;
}