Cod sursa(job #2080217)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 2 decembrie 2017 16:29:32
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#define NMAX 100005

using namespace std;

int a[NMAX], l[NMAX];
int n, length = 1;

void read() {

    ifstream in("scmax.in");
    in >> n;

    for (int i = 1; i <= n; ++i)
        in >> a[i];

    in.close();
}

int binary(int first, int last, int value) {

    int mid, n = last;
    while (first <= last) {

        mid = first + (last - first) / 2;

        if ((a[l[mid]] < value) && (a[l[mid + 1]] >= value || mid == n))
            return mid;
        else {

            if (a[l[mid]] >= value)
                last = mid - 1;
            else
                first = mid + 1;
        }
    }
    return 0; /// return the length
}

int main()
{
    read();

    l[1] = 1;
    int len;

    for (int i = 2; i <= n; i++) {

        len = binary(1, length, a[i]);

        if (l[len + 1] == 0 || a[l[len + 1]] > a[i])
            l[len + 1] = i;

        if (len + 1 > length)
            length = len + 1;
    }

    ofstream out("scmax.out");
    out << length << "\n";

    for (int i = 1; i <= length; i++)
        out << a[l[i]] << " ";
    out.close();

    return 0;
}