Cod sursa(job #2338523)

Utilizator eduardandrei20Nechifor Eduard Andrei eduardandrei20 Data 7 februarie 2019 16:16:07
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <assert.h>
#include <vector>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

const int dim = 100000;
int numere[dim], precedent[dim], secventa[dim], lungimeSecventa = -1, dimensiuneVector, element, pozitie;

int cautBinar(int element) {
    //Vectorul secventa este sortat
    int stanga = 0;
    int dreapta = lungimeSecventa;
    int pozitie = 0, mijloc;

    while (stanga < dreapta) {
        mijloc = (stanga + dreapta) / 2;
        if (element > numere[secventa[mijloc]]) {
            stanga = mijloc + 1;
        } else {
            dreapta = mijloc;
        }
    }
    return dreapta;
}

void afisezRecursiv(int plec) {
    if (plec == -1)
        return;
    afisezRecursiv(precedent[plec]);
    out << numere[plec] <<" ";
}

int main() {

    for (int i = 0; i < dim; i++) {
        precedent[i] = -1;
    }

    in >> dimensiuneVector;
    for (int i = 0; i < dimensiuneVector; i++) {
            in >> element;
            numere[i] = element;
        if (i == 0) {
            secventa[++lungimeSecventa] = i;
        } else if (element < numere[secventa[0]]) {
            secventa[0] = i;
        } else if (element > numere[secventa[lungimeSecventa]]) {
            secventa[++lungimeSecventa] = i;
            precedent[secventa[lungimeSecventa]] = secventa[lungimeSecventa - 1];
        } else {
            pozitie = cautBinar(element);
            secventa[pozitie] = i;
            precedent[secventa[pozitie]] = secventa[pozitie - 1];
        }
    }
    if (lungimeSecventa == -1) {
        out << "0";
    } else {
        out << lungimeSecventa + 1 << "\n";
        afisezRecursiv(secventa[lungimeSecventa]);
    }

    return 0;
}