Cod sursa(job #1607766)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 21 februarie 2016 16:27:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <stack>
using namespace std;

int binarySearch(int left, int right, int N, int val, int a[], int tail[])
{
    int middle;
    while (right - left > 1)
    {
        middle = left + (right - left) / 2;
        if (a[tail[middle]] >= val)
            right = middle;
        else
            left = middle;
    }

    return right;
}

int main()
{
    int N, i;
    ifstream f("scmax.in");
    f >> N;
    int a[N];
    for (i = 0; i < N; i++)
        f >> a[i];
    f.close();

    int tail[N + 1], prev[N], pos;
    int len = 1;
    tail[1] = 0, prev[0] = tail[0] = -1;
    for (i = 1; i < N; i++)
        if (a[i] < a[tail[1]])
        {
            tail[1] = i;
            prev[i] = -1;
        }
        else if (a[i] > a[tail[len]])
        {
            prev[i] = tail[len];
            tail[++len] = i;
        }
        else
        {
            pos = binarySearch(0, len + 1, len + 1, a[i], a, tail);
            prev[i] = tail[pos - 1];
            tail[pos] = i;
        }

    stack<int> st;
    i = tail[len];
    while (i >= 0)
    {
        st.push(a[i]);
        i = prev[i];
    }

    ofstream g("scmax.out");
    g << len << '\n';
    while (!st.empty())
        g << st.top() << ' ', st.pop();
    g.close();
    return 0;
}