Pagini recente » Cod sursa (job #2679008) | Cod sursa (job #2640871) | Cod sursa (job #1356183) | Cod sursa (job #2548344) | Cod sursa (job #2609725)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct element {
int l, lvp; // locul, locul vecinului preferat
};
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, ns, a[100001], sol[100001], nes[10001], v[10001], ii[10001], vv, lv;
element s[100001];
bool gasita;
int lvp(int is) {
if (is >= 1) {
return nes[is - 1];
}
else {
return -1;
}
}
int main() {
fin >> n;
ns = -1;
for (int i = 1; i <= n; i++) {
fin >> a[i];
gasita = false;
for (int is = 0; is <= ns and not gasita; is++) {
if (a[i] <= v[is]) {
nes[is]++; v[is] = a[i]; gasita = true;
}
}
if (not gasita) {
ns++; nes[ns] = 1; v[ns] = a[i];
}
}
ii[0] = 0;
for (int is = 1; is <= ns; is++)
ii[is] = ii[is - 1] + nes[is - 1]; // indicele de inceput al stivei
////
for (int is = 1; is <= ns; is++)
nes[is] = -1;
ns = -1;
for (int i = 1; i <= n; i++) {
gasita = false;
for (int is = 0; is <= ns and not gasita; is++) {
vv = a[s[ii[is] + nes[is]].l];
if (a[i] <= vv) {
nes[is]++; s[ii[is] + nes[is]] = {i, lvp(is)}; gasita = true;
}
}
if (not gasita) {
ns++; nes[ns] = 0; s[ii[ns]] = {i, lvp(ns)};
}
}
fout << ns << '\n';
lv = nes[ns];
for (int is = ns; is >= 0; is--) {
sol[is] = a[s[ii[is] + lv].l];
lv = s[ii[is] + lv].lvp;
}
for (int i = 0; i <= ns; i++)
fout << sol[i] << ' ';
return 0;
}