Cod sursa(job #2171942)

Utilizator FrequeAlex Iordachescu Freque Data 15 martie 2018 14:16:40
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

const int NMAX = 100000 + 5;

stack <int> s;
int n, len;
int v[NMAX];
int aux[NMAX], father[NMAX];

int bs(int val)
{
    int st = -1, dr = len - 1, mijl;
    while (dr - st > 1)
    {
        mijl = st + (dr - st) / 2;
        if (v[aux[mijl]] >= val)
            dr = mijl;
        else
            st = mijl;
    }

    return dr;
}

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

int main()
{
    read();
    memset(father, -1, sizeof(father));

    len = 1;
    for (int i = 1; i < n; ++i)
        if (v[i] < v[aux[0]]) aux[0] = i;
        else if (v[i] > v[aux[len - 1]])
        {
            father[i] = aux[len - 1];
            aux[len++] = i;
        }
        else
        {
            int pos = bs(v[i]);
            father[i] = aux[pos - 1];
            aux[pos] = i;
        }

    fout << len << '\n';

    for (int i = aux[len-1]; i >= 0; i = father[i])
        s.push(v[i]);


    /*
    int index = n - 1;
    while (index != -1)
    {
        s.push(v[index]);
        index = father[index];
    }
*/
    while (!s.empty())
    {
        fout << s.top() << " ";
        s.pop();
    }

    return 0;
}