Cod sursa(job #1135238)

Utilizator Ionut228Ionut Calofir Ionut228 Data 7 martie 2014 15:39:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int N;
int nr, maxim, pos;
int V[100002], best[100002], p[100002], L[100002];

int bs(int x)
{
    int l = -1, r = nr + 1;

    while (r - l > 1)
    {
        int mid = (l + r) / 2;
        if (V[L[mid]] < x && V[L[mid + 1]] >= x)
            return mid;
        else if (V[L[mid]] < x)
            l = mid;
        else
            r = mid;
    }

    return nr;
}


void show(int i)
{
    if (p[i] > 0)
        show(p[i]);
    fout << V[i] << ' ';
}

int main()
{
    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> V[i];
    best[1] = 1;
    L[0] = 0;
    L[1] = 1;
    nr = 1;

    for (int i = 2; i <= N; ++i)
    {
        pos = bs(V[i]);
        p[i] = L[pos];
        best[i] = pos + 1;
        L[pos + 1] = i;
        if (nr < pos + 1)
            nr = pos + 1;
    }

    maxim = 0;
    pos = 0;
    for (int i = 1; i <= N; ++i)
        if (best[i] > maxim)
        {
            maxim = best[i];
            pos = i;
        }

    fout << maxim << '\n';
    show(pos);
    fout << '\n';

    fin.close();
    fout.close();
    return 0;
}