Cod sursa(job #2989782)

Utilizator Luka77Anastase Luca George Luka77 Data 6 martie 2023 23:27:13
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
#define FOR(WHATEVER) for(int i = 1; i <= WHATEVER; ++ i)
using namespace std;

const string problem = "scmax";
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");

const int NMAX = 1e5+5;
int n;
int arr[NMAX], dp[NMAX], p[NMAX], idx[NMAX];

/// READING THE INPUT
int main()
{
    fin >> n;
    for(int i=1;i<=n;++i)
        fin >> arr[i];
    int k=1;
    dp[k] = arr[k];
    for(int i=1;i<=n;++i)
    {
        if(arr[i]>dp[k])
        {
            dp[++k]=arr[i];
            p[i]=k;
        }
        else
        {
            int st=1, dr=k, poz=k+1;
            while(st<=dr)
            {
                int mid=(st+dr)/2;
                if(arr[i]<=dp[mid])
                    poz=mid, dr=mid-1;
                else
                    st=mid+1;
            }
            dp[poz]=arr[i];
            p[i]=poz;
        }
    }
    int j=n;
    for(int i=k;i>=1;--i)
    {
        while(p[j]!=i)
            j--;
        idx[i]=j;
    }
    fout<<k<<'\n';
    for(int i=1;i<=k;++i)
        fout<<arr[idx[i]]<<' ';
}