Cod sursa(job #1224013)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 29 august 2014 14:36:51
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXN 100005

using namespace std;

int n, a[MAXN], stiva[MAXN], best[MAXN], previ[MAXN];
int poz, nr;

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

void afisare(int p)
{
    if (p == -1)
        return;
    afisare(previ[p]);
    printf("%d ", a[p]);
}

int place(int x)
{
   /* int lo = 0, hi = nr - 1, mid;
    while (lo <= hi)
    {
        mid = (lo + hi) / 2;
    }
    if (hi < 0)
    */
    vector<int> v;
    for (int i = 0; i < nr; i++)
        v.push_back(a[stiva[i]]);
    return lower_bound(v.begin(), v.end(), x) - v.begin();

}

void sol()
{
    for (int i = 0; i < n; i++)
    {
        poz = place(a[i]);
        stiva[poz] = i;
        best[i] = poz + 1;
        previ[i] = (poz == 0 ? -1 : stiva[poz-1]);
        nr = poz + 1;
    }
    int maxim = 0, p = 0;
    for (int i = 0; i < n; i++)
        if (best[i] > maxim)
        {
            maxim = best[i];
            p = i;
        }
    printf("%d\n", maxim);
    afisare(p);
}


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

    citire();
    sol();

    return 0;
}