Cod sursa(job #2171918)

Utilizator FrequeAlex Iordachescu Freque Data 15 martie 2018 14:10:11
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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 (st <= dr)
    {
        mijl = (st + dr) / 2;
        if (v[aux[mijl]] >= val)
            dr = mijl - 1;
        else
            st = mijl + 1;
    }

    return st;
}

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

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

    len = 1;
    aux[0] = 1;
    for (int i = 2; 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';
    int index = n;
    while (index != -1)
    {
        s.push(v[index]);
        index = father[index];
    }

    while (!s.empty())
    {
        fout << s.top() << " ";
        s.pop();
    }

    return 0;
}