Cod sursa(job #2954374)

Utilizator AleXutzZuDavid Alex Robert AleXutzZu Data 14 decembrie 2022 08:33:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>

#define MAX_SIZE 200001

int position[MAX_SIZE] = {0};
int v[MAX_SIZE] = {0};

std::ifstream input("scmax.in");
std::ofstream output("scmax.out");

void recon(int start, int len) {
    for (int i = start; i >= 1; --i) {
        if (position[i] == len) {
            recon(i - 1, len - 1);
            output << v[i] << " ";
            break;
        }
    }
}

int main() {
    int dp[MAX_SIZE] = {0};
    int n;

    input >> n;

    for (int i = 1; i <= n; ++i) input >> v[i];

    int len = 1;

    dp[len] = v[1];
    position[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (v[i] > dp[len]) dp[++len] = v[i], position[i] = len;
        else {
            int l = 1, r = len;
            int pos = 0;
            while (l <= r) {
                int mid = (l + r) / 2;

                if (dp[mid] >= v[i]) pos = mid, r = mid - 1;
                else l = mid + 1;
            }
            dp[pos] = v[i];
            position[i] = pos;
        }
    }

    output << len << '\n';

    recon(n, len);

    return 0;
}