Cod sursa(job #1527577)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 18 noiembrie 2015 13:04:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#define DIM 100010
using namespace std;

int K, N;
int V[DIM], T[DIM], W[DIM], D[DIM];

void DFS (int pos)
{
    if (T[pos] != 0)
        DFS (T[pos]);

    printf ("%d ", V[pos]);

    return;
}

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

    scanf ("%d", &N);
    for (int i = 1; i <= N; i ++)
        scanf ("%d", &V[i]);

    W[++K] = 1; D[1] = 1;
    for (int i = 2; i <= N; i ++)
    {
        if (V[i] > V[W[K]])
        {
            W[++K] = i;
            T[i] = W[K-1];
            D[i] = 1 + D[W[K-1]];
        } else {
            int st = 1, dr = K;

            while (st <= dr)
            {
                int mid = st + (dr - st) / 2;

                if (V[i] > V[W[mid]])
                    st = mid + 1;
                else
                    dr = mid - 1;
            }

            if (V[W[dr]] < V[i])
            {
                W[st] = i;
                T[i] = W[dr];
                D[i] = 1 + D[W[dr]];
            }
        }
    }

    int maxim = 0, pos;
    for (int i = 1; i <= N; i ++)
    {
        if (maxim < D[i])
        {
            maxim = D[i];
            pos = i;
        }
    }

    printf ("%d\n", maxim);
    DFS (pos);

    fclose (stdin );
    fclose (stdout);

    return 0;
}