Cod sursa(job #2080226)

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

using namespace std;

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

char buffer[NMAX];
int pos = 0;
ifstream in("scmax.in");

void parseInt(int &a) {

    while (!isdigit(buffer[pos]))
        if (++pos == NMAX)
            in.read(buffer, NMAX), pos = 0;

    a = 0;

    while (isdigit(buffer[pos])) {

        a = a * 10 + (buffer[pos] - '0');
        if (++pos == NMAX)
            in.read(buffer, NMAX), pos = 0;
    }

}

void read() {

    parseInt(n);

    for (int i = 1; i <= n; ++i)
        parseInt(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
}

ofstream out("scmax.out");

void print(int n) {

    if (n != 0) {

        print(p[n]);
        out << a[n] << " ";
    }
}

int main()
{
    read();

    l[1] = 1;
    p[1] = 0;
    int len;

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

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

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

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


    out << length << "\n";
    print(l[length]);

    out.close();

    return 0;
}