Cod sursa(job #3193006)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 13 ianuarie 2024 19:00:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
const int NMAX=100005;
int n,cnt,fin,sfarsit;
int v[NMAX],dp[NMAX],ult[NMAX],parent[NMAX];
stack <int> s;
void parentt(int i)
{
    if(parent[i])
        parentt(parent[i]);
    out<<v[i]<<" ";
}
int cautbin(int val)
{
    int st=0;
    int dr=cnt;
    int mij=(st+dr)/2;
    while(st<=dr)
    {
        if(v[ult[mij]]<val && v[ult[mij+1]]>=val)
        {
            return mij;
        }
        else if(v[ult[mij+1]]<val){
            st=mij+1;
            mij=(st+dr)/2;
        }
        else{
            dr=mij-1;
            mij=(st+dr)/2;
        }
    }
    return cnt;
}
int main()
{
    in>>n;
    for(int i=1; i<=n; i++)
        in>>v[i];
    dp[1]=1;
    ult[1]=1;
    int poz;
    cnt=1;
    for(int i=2; i<=n; i++)
    {
        poz=cautbin(v[i]);
        dp[i]=poz+1;
        parent[i]=ult[poz];
        cnt=max(cnt,poz+1);
        ult[poz+1]=i;
    }
    for(int i=1; i<=n; i++)
    {
        if(dp[i]>fin)
        {
            fin=dp[i];
            sfarsit=i;
        }
    }
    out<<fin<<'\n';
    parentt(sfarsit);
    return 0;
}