Cod sursa(job #2886776)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 8 aprilie 2022 12:14:05
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const string filename = "scmax";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int maxN = 100005, inf = 2e9 + 5;
int n, v[maxN], dp[maxN], s[maxN], ans, last;
vector <int> sir;

int cautbin(int x)
{
    int aux = 0;
    for(int i = (1 << 19); i; i >>= 1)
        if(aux + i <= n && s[aux + i] < x)
            aux += i;
    return aux;
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> v[i];
        s[i] = inf;
    }
    for(int i = 1; i <= n; i++)
    {
        int poz = cautbin(v[i]) + 1;
        dp[i] = poz;
        s[poz] = min(s[poz], v[i]);
        if(dp[i] > ans)
        {
            ans = dp[i];
            last = i;
        }
    }
    fout << ans << '\n';
    sir.push_back(last), ans--;
    for(int i = last; i >= 1; i--)
    {
        if(dp[i] == ans && v[i] < v[last])
        {
            sir.push_back(i);
            ans--;
            last = i;
        }
    }
    reverse(sir.begin(), sir.end());
    for(int x : sir)
        fout << v[x] << ' ';
    return 0;
}