Cod sursa(job #2869141)

Utilizator FastmateiMatei Mocanu Fastmatei Data 11 martie 2022 12:49:11
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

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

int a[100005];
int dp[100005];
int P[100005];
int k,n;
int sol[100005],nr;

void CautBin(int i)
{
    if(a[i]<=dp[1])
    {
        dp[1]=a[i];
        P[i]=1;
        return;
    }
    if(a[i]>dp[k])
    {
        k++;
        dp[k]=a[i];
        P[i]=k;
        return;
    }
    int st,dr,mij,poz;
    st=1;
    dr=k;
    poz=k;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(a[i]<=dp[mij])
        {
            poz=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    dp[poz]=a[i];
    P[i]=poz;
}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    dp[1]=a[1];
    P[1]=1;
    k=1;
    for(int i=2;i<=n;i++)
        CautBin(i);
    fout<<k<<"\n";
    int len=k;
    int ult=2e9;
    for(int i=n;i>=1 && len>=1;i--)
    if(P[i]==len && a[i]<ult)
    {
        sol[++nr]=a[i];
        ult=a[i];
        len--;
    }
    for(int i=nr;i>=1;i--)
        fout<<sol[i]<<" ";
    return 0;
}