Pagini recente » Cod sursa (job #2471773) | Cod sursa (job #1329746) | Cod sursa (job #124066) | Cod sursa (job #85539) | Cod sursa (job #2338525)
#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;
}