Pagini recente » Cod sursa (job #1679476) | Cod sursa (job #1254584) | Cod sursa (job #2289682) | Cod sursa (job #1254040) | Cod sursa (job #2338526)
#include <iostream>
#include <fstream>
#include <assert.h>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int dim = 100002;
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;
}