Cod sursa(job #3142872)

Utilizator AlexPlesescuAlexPlesescu AlexPlesescu Data 25 iulie 2023 10:36:55
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define NMAX 100005

using namespace std;

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

int n,dp[NMAX],p[NMAX],ind[NMAX],k,st,dr,mij,ans,v[NMAX];
int main()
{
    ios_base::sync_with_stdio(0);
    cin >> n;
    for(int i=1; i <= n; i++)
        cin >> v[i];
    dp[1] = v[1];
    p[1] = 1;
    k = 1;
    for(int i=2; i <= n; i++)
    {
        if(v[i] > dp[k])
        {
            dp[++k] = v[i];
            p[i] = k;
        }
        else
        {
            st=1;
            dr=k;
            ans = k + 1;
            while(st <= dr)
            {
                mij=st+(dr-st)/2;
                if(dp[mij] > v[i])
                {
                    ans = mij;
                    dr = mij-1;
                }
                else
                    st = mij+1;
            }
            dp[ans] = v[i];
            p[i] = ans;
        }
    }
    cout << k << '\n';
    int j = n;
    for(int i = k ; i >= 1 ; i --)
    {
        while(p[j] != i)
            j --;
        ind[i] = j;
    }
    for(int i=1; i <= k; i++)
    {
        cout << v[ind[i]] << ' ';
    }
    return 0;
}