Cod sursa(job #1362956)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 26 februarie 2015 17:10:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>

#define NMAX 100005
#define INF 0x3f3f3f3f

using namespace std;

int n, lg, a[NMAX], s1[NMAX], s2[NMAX], ans[NMAX];
stack <int> st;

void read()
{
    scanf("%d", &n);

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

void solve()
{
    int poz;

    s1[1] = a[1];
    s2[1] = 1;
    lg = 1;

    for (int i = 2; i <= n; ++i)
    {
        poz = lower_bound(s1, s1 + lg + 1, a[i]) - s1;
        if (poz > lg)
        {
            s1[++lg] = a[i];
            s2[i] = lg;
        }
        else
        {
            s1[poz] = a[i];
            s2[i] = poz;
        }
    }

    printf("%d\n", lg);

    for (int i = n; i >= 1; --i)
    {
        if (lg == 0)
            break;
        if (s2[i] == lg)
        {
            st.push(a[i]);
            lg--;
        }
    }

    while(!st.empty())
    {
        printf("%d ", st.top());
        st.pop();
    }
}

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

    read();
    solve();

    return 0;
}