Cod sursa(job #1667035)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 28 martie 2016 16:38:59
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>

using namespace std;

int sir[100001], u[100001], pred[100001], poz;

ofstream file_out ("scmax.out");

int cautBin (int nr) {
    int i = 0, pas = 1 << 16;
    while (pas) {
        if (pas + i <= poz && sir[u[i + pas]] < nr) {
            i += pas;
        }
        pas /= 2;
    }
    return i;
}

void afisare(int i) {
    if (i == 0) {
        return;
    }
    afisare(i - 1);
    file_out << sir[u[i]] << " ";
}

int main() {
    ifstream file_in ("scmax.in");

    int n, loc;
    int i;

    // Citirea datelor
    file_in >> n;
    file_in >> sir[1];

    // Calcularea solutiei
    poz = 0;
    u[++poz] = 1;
    pred[1] = 0;

    for (i = 2; i <= n; i++) {
        file_in >> sir[i];
        loc = cautBin(sir[i]);

        if (loc == poz) {
            ++poz;
        }
        u[loc + 1] = i;
        pred[i] = u[loc];
    }

    // Afisarea solutiei
    if (n == 1) {
        file_out << 1 << "\n" << sir[1];
        return 0;
    }
    file_out << poz << "\n";
    afisare(poz);

    return 0;
}