Cod sursa(job #3337896)

Utilizator MMEnisEnis Mutlu MMEnis Data 30 ianuarie 2026 17:38:35
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int s[100001];
int ps[100001];
int v[100001];
int dp[100001];
int n, k = 0, last;

int bs ( int x, int sir[100001] )
{
    int st = 1, dr = k;
    int sol = k + 1;
    while ( st <= dr )
    {
        int mij = ( st + dr ) / 2;
        if ( sir[mij] >= x )
        {
            sol = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }
    return sol;
}

void afisare()
{
    vector <int> afis;
    while ( k > 0 )
    {
        afis.push_back(v[last]);
        last = dp[last];
        k --;
    }
    for ( int i = afis.size() - 1; i >= 0; i -- )
        g << afis[i] << " ";
}

int main()
{
    f >> n;
    for ( int i = 1; i <= n; i ++ )
    {
        f >> v[i];
        int poz = bs( v[i], s ); /// upper bound
        s[poz] = v[i];
        ps[poz] = i;
        dp[i] = ps[poz - 1];
        k = max ( k, poz );
        if ( k == poz )
            last = i;
    }
    g << k << '\n';
    afisare();
    return 0;
}