Cod sursa(job #2682134)

Utilizator andrei.florea0405Florea Andrei-Bogdan andrei.florea0405 Data 7 decembrie 2020 21:07:43
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define MOD 1000000007

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n;
int a[100010];
vector<int> d(100010, INT_MAX);
int p[100010];
int pos[100010];


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    fin >> n;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }

    d[0] = INT_MIN;
    p[0] = -1;
    for (int i = 1; i <= n; i++) {
        int j = upper_bound(d.begin(), d.end(), a[i]) - d.begin();
        if (d[j - 1] < a[i] && a[i] < d[j]) {
            d[j] = a[i];
            pos[j] = i;
            p[i] = j;
        }
    }

    int ans = 0;
    for (int i = 0; i <= n; i++) {
        if (d[i] < INT_MAX) {
            ans = i;
        }
    }


    fout << ans << "\n";
    int last_added = d[ans];
    while (ans--) {
        fout << last_added << " ";
        last_added = d[p[pos[ans]]];
    }

    return 0;
}