Cod sursa(job #1603482)

Utilizator RaduToporanRadu Toporan RaduToporan Data 17 februarie 2016 16:36:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>

using namespace std;

int v[100002], m[100002], p[100002];

void printAnswer(int x)
{
    if (x == 0)
        return;
    printAnswer(p[x]);
    printf("%d ", v[x]);
}

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

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

    p[1] = 0;
    m[1] = 1;
    int l = 1;
    for (int i = 2; i <= n; i++)
    {
        int left = 1;
        int right = l;
        while (left <= right)
        {
            int mid = (left+right+1)/2;
            if (v[m[mid]] < v[i])
                left = mid+1;
            else
                right = mid-1;
        }

        p[i] = m[left-1];
        m[left] = i;

        if (left > l)
            l = left;
    }

    printf("%d\n", l);
    printAnswer(m[l]);
    printf("\n");

    return 0;
}