Cod sursa(job #3301945)

Utilizator tedicTheodor Ciobanu tedic Data 1 iulie 2025 16:20:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;
const int inf=INT_MAX;
int dp[100005]; ///dp[i] = valoarea minima care vine pe pozitia i pt un subsir maximal s crescator
int v[100005], ind[100005], precedent[100005]; ///cu ind marcam ce numar apare pe fiecare pozitie a noului sir
///precedent arata numarul cu o pozitie mai mica la momentul in care numarul e introdus in sir
vector<int> rasp;
int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>v[i];
    v[0]=-inf;
    v[n+1]=inf;
    for(int i=1; i<=n; i++)
        ind[i]=n+1;
    int maxim=0;
    for(int i=1; i<=n; i++)
    {
        int poz=0;
        for(int k=20; k>=0; k--)
        {
            if(poz+(1<<k)<=n && v[i]>v[ind[poz+(1<<k)]]) ///cautam binar pe biti cea mai mare poz din sirul format care e mai mica ca v[i]
                poz+=(1<<k);
        }
        poz++; ///v[i] e introdus pe pozitia poz+1
        ind[poz]=i;
        maxim=max(maxim, poz);
        precedent[i]=ind[poz-1];
    }
    cout<<maxim<<'\n';
    int pozcurenta=ind[maxim];
    for(int i=1; i<=maxim; i++)
        rasp.push_back(v[pozcurenta]), pozcurenta=precedent[pozcurenta];
    reverse(rasp.begin(), rasp.end());
    for(int i=0; i<rasp.size(); i++)
        cout<<rasp[i]<<" ";
    return 0;
}