Cod sursa(job #3309781)

Utilizator Lex._.Lex Guiman Lex._. Data 8 septembrie 2025 22:10:46
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;

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

int a[NMAX];
int dp[NMAX], ult_poz[NMAX];

int cautare_binara(int val, int n)
{
    int st=0, dr=n, poz=0;
    while(st<=dr)
    {
        int mij=st+(dr-st)/2;
        if(a[dp[mij]]<val)
        {
            poz=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    return poz+1;
}

int main()
{
    int n;
    in >> n;
    for(int i=1; i<=n; i++)
    {
        in >> a[i];
    }
    int l_max=0, poz_lmax=0; ///lungimea maxima si pozitia din vectorul a a ultimului element adaugat
    for(int i=1; i<=n; i++)
    {
        if(a[dp[l_max]]<a[i])
        {
            ult_poz[i]=dp[l_max];
            dp[++l_max]=i;
            poz_lmax=i;
        }
        else
        {
            int poz=cautare_binara(a[i], l_max);
            dp[poz]=i;
            ult_poz[i]=dp[poz-1];
        }
    }
    out << l_max << "\n";

    vector<int> lis; ///subsirul cerut
    while(poz_lmax!=0)
    {
        lis.push_back(poz_lmax);
        poz_lmax=ult_poz[poz_lmax];
    }
    reverse(lis.begin(), lis.end());

    for(auto& i : lis) ///afisam subsirul
        out << a[i] << " "; out << "\n";

    return 0;
}