Cod sursa(job #3164236)

Utilizator Constantin.Dragancea Constantin Constantin. Data 2 noiembrie 2023 14:54:23
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb



#include <iostream>
#include <fstream>
#include <limits>
using namespace std;

int binsearch(int arr[], int L, int R, int x){
    int l = L, h = R;
    while (l != h){
        int m = (l + h) / 2;
        if (x <= arr[m]){
            h = m;
        } 
        else {
            l = m + 1;
        }
    }

    return l;
}

int main(){
    ifstream cin ("scmax.in");
    ofstream cout("scmax.out");
    int N;
    cin >> N;

    int A[N + 1];
    for(int i = 0; i < N; i++){
        cin >> A[i];
    }

    const int inf = std::numeric_limits<int>::max();
    int n, m, l;
    int M[N + 10];
    int L[N + 10];
    int K[N + 10];
    int B[N + 10];

    A[N] = inf;
    n = m = l = 0;
    

    M[0] = A[0];
    for (int i = 1; i < N; i++)
        M[i] = inf;
    for (int i = 0; i <= N; i++)
        B[i] = inf;
    for (int i = 0; i <= N; i++)
        L[i] = 0;
    K[0] = 1;


    while (n != N){
        m = max(m, L[n] + 1);

        L[n + 1] = binsearch(M, 0, m + 1, A[n + 1]);

        M[L[n + 1]] = min(M[L[n + 1]], A[n + 1]);
        
        K[n + 1] = L[n + 1] + 1;

        n = n + 1;

    }

    l = m;
    n = N - 1;




    while (l != 0){
        if (K[n] == l && A[n] < B[l]){
            B[l - 1] = A[n];


            l = l - 1;

            n = n - 1;
        } else {
            n = n - 1;
        }
    }


    for (int i = 0; i < m; i++)
        cout << B[i] << '\n';

    return 0;
}