Cod sursa(job #1413368)

Utilizator Ionut228Ionut Calofir Ionut228 Data 1 aprilie 2015 20:37:18
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, M;
int V[100005], sol[100005], TT[100005];

int cb(int x)
{
    if (!M)
        return 1;
    int lt = 0, rt = M + 1;
    while (rt - lt > 1)
    {
        int mid = (lt + rt) / 2;
        if (V[sol[mid]] <= x)
            lt = mid;
        else
            rt = mid;
    }
    if (V[sol[lt]] == x)
        return -1;
    else if (lt == 0)
        return 1;
    else if (lt == M)
        return M + 1;
    return lt;
}

void afis(int pos)
{
    if (pos == 0)
        return;
    afis(TT[pos]);

    fout << V[pos] << ' ';
}

int main()
{
    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> V[i];
    for (int i = 1; i <= N; ++i)
    {
        int pos = cb(V[i]);
        if (pos == -1)
            continue;

        sol[pos] = i;
        TT[i] = sol[pos - 1];

        M = max(M, pos);
    }

    fout << M << '\n';
    afis(sol[M]);

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