Pagini recente » Monitorul de evaluare | Diferente pentru utilizator/djok intre reviziile 85 si 84 | Istoria paginii utilizator/cires | Monitorul de evaluare | Cod sursa (job #1034747)
#include <fstream>
#include <vector>
#define NMAX 100010
using namespace std;
int N;
vector<int> v, subsir, pozitii;
void input() {
ifstream in("scmax.in");
in >> N;
v.resize(N);
pozitii.resize(N);
for (int i = 0; i < N; ++i) {
in >> v[i];
}
in.close();
}
int binSearch(const int &val) {
int left = 0, right = subsir.size() - 1;
int best = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (subsir[mid] >= val) {
best = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return best;
}
void scmax() {
subsir.push_back(v[0]);
pozitii[0] = 0;
for (int i = 0; i < N; ++i) {
if (v[i] > subsir.back()) {
subsir.push_back(v[i]);
pozitii[i] = subsir.size() - 1;
continue;
}
//caut in "subsir" cel mai mic element mai mare sau egal cu v[i]:
int pos = binSearch(v[i]);
subsir[pos] = v[i];
pozitii[i] = pos;
}
}
void output() {
ofstream out("scmax.out");
int next = subsir.size() - 1;
out << next + 1 << "\n";
vector<int> output;
int i = N - 1;
while (next >= 0) {
if (pozitii[i] == next) {
output.push_back(v[i]);
--next;
}
--i;
}
for (i = subsir.size() - 1; i >= 0; --i) {
out << output[i] << " ";
}
out.close();
}
int main() {
input();
scmax();
output();
return 0;
}