Cod sursa(job #2964336)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 12 ianuarie 2023 20:20:33
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;

const int MAX = 1e5 + 2;

const int inf = 2e9 + 1;

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

unordered_map <long long,long long> um;

vector<long long>ans;

long long dp[MAX], v[MAX] , n , a;

// dp[i] = numarul minim cu care s-ar termina o secventa de lungime i;

int main()
{

    cin >> n;

    dp[0] = 0;

    int maxim = 0;

    for(int i = 1 ; i <= n ; i++){

        dp[i] = inf;
    }

    for(int i = 1 ; i <= n ; i++){

        cin >> v[i];

        a = v[i];

        int x = upper_bound(dp,dp+1+n,a) - dp;

        if( a < dp[x] && a > dp[x-1]){

            dp[x] = a;

            um[a] = dp[x-1];

            if( x <= n ) maxim = max(maxim,x);
        }

    }

    cout << maxim << '\n';

    int x = dp[maxim];

    while(um[x]){

        ans.push_back(x);

        x = um[x];
    }

    ans.push_back(x);

    reverse(ans.begin(),ans.end());

    for(auto i: ans) cout << i << ' ';

    return 0;
}