Cod sursa(job #2587928)

Utilizator xCata02Catalin Brita xCata02 Data 23 martie 2020 19:55:57
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cin fin
#define cout fout

#define Nmax 100100

int n;
int a[Nmax], dp[Nmax], poz[Nmax], sol[Nmax];

void read() {
    cin >> n;

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

int cb(int st, int dr, int val) {
    int mijl, pivot;
    while(st <= dr) {
        mijl = (st + dr) / 2;
        if(dp[mijl] < val) {
            st = mijl + 1;
        } else {
            pivot = mijl;
            dr = mijl - 1;
        }
    }

    return pivot;
}

void solve() {
    int k = 1;
    dp[1] = a[1];
    poz[1] = 1;

    for(int i=2; i <= n; i++) {
        if(a[i] > dp[k]) {
            k++;
            dp[k] = a[i];
            poz[i] = k;
        } else {
            int pivot = cb(1, k, a[i]);

            dp[pivot] = a[i];
            poz[i] = pivot;
        }
    }

    cout << k << endl;

    for(int i=n; i && k; i--) {
        if(poz[i] == k) {
            sol[k--] = a[i];
        }
    }

    while(sol[++k]) {
        cout << sol[k] << " ";
    }
}

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