Cod sursa(job #3031662)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 20 martie 2023 16:06:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, a[100005], best[100005], lp[100005], p[100005], Max;

int cauta(int x) {
    int ans = 0;
    int l = 1, r = Max;
    while (l <= r) {
        int m = (l + r) / 2;
        if (a[lp[m]] < x) {
            ans = max(ans, m);
            l = m + 1;
        } else r = m - 1;
    }

    return ans;
}

void afisare(int pos) {
    if (p[pos] != -1 && a[p[pos]] != 0) afisare(p[pos]);
    out<<a[pos]<<" ";
}

int main() {
    in>>n;
    for (int i = 1; i <= n; i++)
        in>>a[i];
    
    best[1] = 1;
    lp[1] = 1;
    p[1] = -1;
    p[0] = -1;
    Max = 1;
    for (int i = 2; i <= n; i++) {
        int pos = cauta(a[i]);
        //cout<<pos<<'\n';
        best[i] = pos + 1;
        p[i] = lp[pos];
        lp[pos + 1] = i;
        if (pos + 1 > Max) Max = pos + 1; 
    }

    int scmax = 0;
    int pmax = 0;
    for (int i = 1; i <= n; i++)
        if (best[i] > scmax) {
            scmax = best[i];
            pmax = i;
        }
    
    out<<scmax<<'\n';
    afisare(pmax);
}