Cod sursa(job #1362920)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 26 februarie 2015 16:46:19
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstring>

#define NMAX 100005
#define INF 0x3f3f3f3f

using namespace std;

int n, lg, a[NMAX], s1[NMAX], s2[NMAX], ans[NMAX];

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

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

    memset(s1, INF, sizeof(s1));
}

int binary_search(int nr)
{
    int li = 1, lf = lg, mid, minim = INF, poz = 0;

    while (li <= lf)
    {
        mid = (li + lf) / 2;
        if (nr >= s1[mid])
        {
            li = mid + 1;
            continue;
        }
        else if (nr <= s1[mid])
        {
            minim = s1[mid];
            poz = mid;
            lf = mid - 1;
            continue;
        }
        else break;
    }
    return poz;
}

void solve()
{
    int poz, lgaux;

    for (int i = 1; i <= n; ++i)
    {
        poz = binary_search(a[i]);
        if (poz == 0 || poz > lg)
        {
            s1[++lg] = a[i];
            s2[i] = lg;
        }
        else
        {
            s1[poz] = a[i];
            s2[i] = poz;
        }
    }

    lgaux = lg;

    for (int i = n; i >= 1; --i)
        if (s2[i] == lgaux)
        {
            ans[lgaux] = s1[lgaux];
            lgaux--;
        }
    printf("%d\n", lg);

    for (int i = 1; i <= lg; ++i)
        printf("%d ", ans[i]);
}

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

    read();
    solve();

    return 0;
}