Cod sursa(job #922498)

Utilizator sebii_cSebastian Claici sebii_c Data 22 martie 2013 11:16:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

#include <algorithm>
#include <vector>

using namespace std;

const int MAXN = 100001;

int length;
int parent[MAXN];
int pos[MAXN];
int best[MAXN];

int v[MAXN];

int binary_search(int val)
{
    int lo = 0, hi = length;

    while (lo <= hi) {
        int mid = (lo + hi) / 2;

        if (v[pos[mid]] < val && val <= v[pos[mid + 1]]) {
            return mid;
        } else if (v[pos[mid + 1]] < val) {
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    return length;
}

void print(int p)
{
    if (parent[p] > 0)
        print(parent[p]);
    printf("%d ", v[p]);
}

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]);

    length = 1;
    best[1] = pos[1] = 1;
    pos[0] = 0;

    for (int i = 2; i <= N; ++i) {
        int p = binary_search(v[i]);

        parent[i] = pos[p];
        best[i] = p + 1;
        pos[p + 1] = i;
        if (length < p + 1) 
            length = p + 1;
    }

    int max_len = 0, p = 0;
    for (int i = 1; i <= N; ++i)
        if (max_len < best[i]) {
            max_len = best[i];
            p = i;
        }

    printf("%d\n", max_len);
    print(p);
    printf("\n");

    return 0;
}