Cod sursa(job #1329280)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 29 ianuarie 2015 12:33:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <algorithm>
#define DIM 100005
#define infile "scmax.in"
#define outfile "scmax.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

int n;

int v[DIM], Sol[DIM], dp[DIM], t[DIM];

int main() {

    f >> n;

    for (int i = 1; i <= n; ++i)
        f >> v[i];

    int l = 0;

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

        int st = 1, dr = l, val = v[i];

        bool ok = true;

        while (st <= dr) {

            int mid = (st + dr) / 2;

            if (v[dp[mid]] == val) {
                ok = false;
                break;
            }

            if (v[dp[mid]] < val)
                st = mid + 1;
            else
                dr = mid - 1;

        }

        if (!ok)
            continue;

        if (st == l + 1) {
            dp[++l] = i;
            t[i] = dp[l - 1];
        }
        else
        if (st == 1) {
            dp[1] = i;
            t[i] = 0;
        }
        else {
            dp[st] = i;
            t[i] = dp[st - 1];
        }

    }

    g << l << '\n';

    int sol = 0;

    for (int i = dp[l]; i; i = t[i])
        Sol[++sol] = v[i];

    for (int i = sol; i; --i)
        g << Sol[i] << ' ';

    return 0;
}

//Trust me, I'm the Doctor!