Cod sursa(job #2733098)

Utilizator As932Stanciu Andreea As932 Data 29 martie 2021 21:28:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;

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

typedef long long ll;
const int nmax = 1e5 + 5;

int n, v[nmax], dp[nmax], idx[nmax];

void read(){
    cin >> n;

    for(int i = 1; i <= n; i++)
        cin >> v[i];
}

int srch(int val, int m){
    int l = 1, r = m, sol = 0;

    while(l <= r){
        int mid = (l + r) / 2;
        if(dp[mid] >= val){
            r = mid - 1;
            sol = mid;
        } else
            l = mid + 1;
    }

    return sol;
}

void print(int k){
    int j = n;
    int ans[k + 1];

    for(int i = k; i >= 1; i--){
        while(idx[j] != i)
            j--;
        ans[i] = v[j];
    }

    cout << k << "\n";
    for(int i = 1; i <= k; i++)
        cout << ans[i] << " ";
}

void solve(){
    int k = 1;
    dp[1] = v[1];
    idx[1] = 1;

    for(int i = 2; i <= n; i++)
        if(v[i] > dp[k]){
            dp[++k] = v[i];
            idx[i] = k;
        } else {
            int pos = srch(v[i], k);
            dp[pos] = v[i];
            idx[i] = pos;
        }

    print(k);
}

int main()
{
    read();
    solve();

    return 0;
}