Cod sursa(job #3277253)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 15 februarie 2025 15:14:05
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int NMAX = 100001;
int v[NMAX], last[NMAX], parent[NMAX], lg[NMAX];
int maxLength = 1;

int findMaxIncreasingLength(int i)
{
    int p = 0, u = maxLength, ans = -1;
    while (p <= u)
    {
        int mid = (p + u) / 2;
        if (v[last[mid]] < v[i])
        {
            ans = mid;
            p = mid + 1;
        }
        else
        {
            u = mid - 1;
        }
    }
    return ans;
}

void printSubsequence(int poz)
{
    if (poz == 0)
    {
        return;
    }
    printSubsequence(parent[poz]);
    g << v[poz] << ' ';
}

int main()
{
    int n;
    f >> n;
    for (int i = 1; i <= n; i++)
    {
        f >> v[i];
    }
    parent[1] = 0;
    lg[1] = 1;
    last[1] = 1;
    int lastPos = 1;
    for (int i = 2; i <= n; i++)
    {
        int currentLength = findMaxIncreasingLength(i);
        lg[i] = currentLength + 1;
        last[currentLength + 1] = i;
        parent[i] = last[currentLength];
        if (lg[i] > maxLength)
        {
            lastPos = i;
            maxLength = lg[i];
        }
    }
    g << maxLength << '\n';
    printSubsequence(lastPos);
    return 0;
}