Nu aveti permisiuni pentru a descarca fisierul grader_test16.ok

Cod sursa(job #3282912)

Utilizator 1gbr1Gabara 1gbr1 Data 7 martie 2025 14:45:35
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <random>
#include <fstream>
#include <stack>

using namespace std;

int v[100005], n, dp[100005], k, pos[100005];

void Read()
{
    ifstream fin("scmax.in");
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
}

int BinSearch(int val)
{
    int left = 1, right = k, mid, p = -1;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (dp[mid] >= val)
        {
            p = mid;
            right = mid - 1;
        }
        else left = mid + 1;
    }
    return p;
}

void LIS()
{
    ofstream fout("scmax.out");
    dp[++k] = v[1];
    pos[1] = 1;
    for (int i = 2; i <= n; i++)
        if (v[i] > dp[k])
        {
            dp[++k] = v[i];
            pos[i] = k;
        }
        else
        {
            int p = BinSearch(v[i]);
            dp[p] = v[i];
            pos[i] = p;
        }
    fout << k << "\n";
    int last = 1;
    for (int i = 2; i <= n; i++)
        if (pos[i] == k) last = i;
    stack<int> st;
    st.push(last);
    for (int i = last - 1; i >= 1; i--)
        if (pos[i] == pos[last] - 1 && v[i] < v[last])
        {
            last = i;
            st.push(last);
        }
    while (!st.empty())
    {
        fout << v[st.top()] << " ";
        st.pop();
    }
}

int main() {
    Read();
    LIS();
    return 0;
}