Cod sursa(job #1889361)

Utilizator Burbon13Burbon13 Burbon13 Data 22 februarie 2017 18:11:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

int n,v[nmx];
int dp[nmx],bin[nmx],ant[nmx],t,maxim,pos;

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

void algoritm()
{
    dp[1] = 1;
    bin[1] = 1;
    ant[1] = 0;
    t = 1;

    for(int i = 2; i <= n; ++i)
    {
        if(v[i] > v[bin[t]])
        {
            ++ t;
            bin[t] = i;
            ant[i] = bin[t-1];
            dp[i] = t;
        }
        else
        {
            int st = 1, dr = t;
            while(st <= dr)
            {
                int mij = (st + dr) / 2;
                if(v[bin[mij]] >= v[i] && v[bin[mij-1]] < v[i])
                {
                    bin[mij] = i;
                    ant[i] = bin[mij-1];
                    dp[i] = mij;
                    dr = st - 1;
                }
                else if(v[bin[mij-1]] >= v[i])
                    dr = mij - 1;
                else
                    st = mij + 1;
            }
        }
        if(maxim < dp[i])
        {
            maxim = dp[i];
            pos = i;
        }
    }
}

void recursiv(int p)
{
    if(ant[p])
        recursiv(ant[p]);
    printf("%d ", v[p]);
}

void afish()
{
    printf("%d\n", maxim);
    recursiv(pos);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    citire();
    algoritm();
    afish();
    return 0;
}