Cod sursa(job #2172102)

Utilizator FrequeAlex Iordachescu Freque Data 15 martie 2018 15:03:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

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

const int NMAX = 100000 + 5;

stack <int> ans;
int n, lungime;
int v[NMAX];
int indice[NMAX], father[NMAX], sol[NMAX];

int bs(int ind)
{
    int st = 1, dr = lungime, mijl, sol = 0;
    while (st <= dr)
    {
        mijl = (st + dr) / 2;
        if (v[ind] > v[indice[mijl]])
        {
            sol = mijl;
            st = mijl + 1;
        }
        else
            dr = mijl - 1;
    }

    return sol + 1;
}

void build_dp()
{
    indice[1] = 1;
    lungime = 1;

    for (int i = 2; i <= n; ++i)
    {
        if (v[i] > v[indice[lungime]])
        {
            ++lungime;
            indice[lungime] = i;
            father[i] = indice[lungime - 1];
        }
        else
        {
            int poz = bs(i);
            indice[poz] = i;
            father[i] = indice[poz - 1];
        }
    }
}

void build_ans()
{
    int index = indice[lungime];
    while (index > 0)
    {
        ans.push(v[index]);
        index = father[index];
    }
}

void write()
{
    fout << lungime << '\n';
    while (!ans.empty())
    {
        fout << ans.top() << " ";
        ans.pop();
    }
}

void read()
{
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> v[i];
}

int main()
{
    read();
    build_dp();
    build_ans();
    write();

    return 0;
}