Cod sursa(job #3253684)

Utilizator marinaluca2008Marina Luca Stefan marinaluca2008 Data 4 noiembrie 2024 11:38:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

#pragma GCC optimize ("O3")
#pragma GCC optimize ("fast-math")
#pragma GCC optimize ("unroll-loops")

using namespace std;
#define int long long
#define ll long long
#define all (x) begin(x), end(x)
#define xx first
#define yy second


#define cin fin
#define cout fout

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


using pii = pair <int, int>;
using tii = tuple <int, int>;

int n;
constexpr int NMAX = (int) 1e5;
int v[NMAX + 1];
int dp[NMAX + 1];
int poz[NMAX + 1];
int ans1[NMAX + 1];
int k;
inline int bn (int ans, int l, int r)
{
    int idx;
    while (l <= r)
    {
        int mid = (l + r) >> 1;
        if (ans <= dp[mid])
        {
            idx = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    return idx;
}
signed main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;
    for (int i = 1; i <= n; ++ i)
    {
        cin >> v[i];
    }
    k = 1;
    dp[1] = v[1];
    poz[1] = 1;
    for (int i = 2; i <= n; ++ i)
    {
        if (v[i] > dp[k])
        {
            dp[++ k] = v[i];
            poz[i] = k;
        }
        else
        {
            int val = bn (v[i], 1, k);
            dp[val] = v[i];
            poz[i] = val;
        }
    }
    int cp = n;
    for (int i = k;i >= 1; -- i)
    {
        while (poz[cp] != i)
            cp --;
        ans1[i] = cp;
    }
    cout << k << '\n';
    for (int i = 1; i <= k; ++ i)
    {
       cout << v[ans1[i]] << ' ';
    }
    return 0;
}