Cod sursa(job #2170527)

Utilizator UnseenMarksmanDavid Catalin UnseenMarksman Data 15 martie 2018 03:42:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#define NMAX 100002
#define Inf 1<<30

using namespace std;

int n, l;
int v[NMAX], P[NMAX], Q[NMAX], S[NMAX];

void read()
{
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &v[i]);
    }
}

int Insert(int k, int st, int dr)
{
    int mid=(st+dr)/2;
    if(st==dr)
    {
        if(st>l)
            Q[++l+1]=Inf;

        Q[st]=k;
        return st;
    }
    else
    {
        if(k<=Q[mid])
            return Insert(k,st,mid);
        else
            return Insert(k,mid+1,dr);
    }
}

void solve()
{
    int copie=n;

    Q[1]=Inf;
    for(int i=1; i<=n; i++)
    {
        P[i]=Insert(v[i],1,l+1);
    }
    for(int i=l; i; i--)
    {
        while(P[copie]!=i)
            copie--;

        S[i]=v[copie];
    }
}

void write()
{
    printf("%d\n", l);
    for(int i=1; i<=l; i++)
    {
        printf("%d ", S[i]);
    }
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    read();
    solve();
    write();

    return 0;
}