Cod sursa(job #2591861)

Utilizator alexboat10759Alex Mateescu alexboat10759 Data 31 martie 2020 16:02:34
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

int A[100002],D[100002],P[100002];

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

    int n,k,cnt,cnt1=1;
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>A[i];
    }

    k = 1, D[k] = A[1], P[1] = 1;
    for(int i = 2 ; i <= n ; i ++)
    {
        if(A[i] > D[k])
            k++, P[i] = k, D[k]=A[i];
        else if(A[i]==D[k])
            P[i]=k;
        else
        {
            int st = 1, dr = k, poz = k + 1;
            while(st <= dr)
            {
                int m = (st + dr) / 2;
                if(D[m] > A[i])
                    poz = m, dr = m - 1;
                else
                    st = m + 1;
            }
            if(A[i]==D[poz])
            {
                poz--;
            }
            D[poz] = A[i];
            P[i]=poz;
        }
    }
    cnt=k;
    for(int i=n;i>=1;i--)
    {
        if(P[i]==cnt){
            cnt--;
            D[cnt1]=i;
            cnt1++;
        }
    }
    fout<<k<<'\n';
    for(int i=cnt1-1;i>=1;i--)
    {
        fout<<A[D[i]]<<" ";
    }
    return 0;
}