Pagini recente » Cod sursa (job #2822177) | Cod sursa (job #191959) | Cod sursa (job #576149) | Cod sursa (job #2371942) | Cod sursa (job #1456823)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in;
ofstream out;
int v[100000], M[100000], pre[100000], S[100000], L = 0;
void findSub (int n) {
for (int i = 0; i < n; ++i) {
int lo = 1, hi = L;
while (hi >= lo) {
int mid = lo + (hi - lo) / 2;
if (v[i] > v[M[mid]]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
if (lo > L) {
L = lo;
}
pre[i] = M[lo - 1];
M[lo] = i;
}
int k = M[L];
for (int i = L-1; i >= 0; --i) {
S[i] = v[k];
k = pre[k];
}
}
int main (void) {
in.open("scmax.in");
out.open("scmax.out");
int n;
in >> n;
for (int i = 0; i < n; ++i) {
in >> v[i];
}
findSub(n);
out << L << "\n";
for (int i = 0; i < L; ++i) {
out << S[i] << " ";
}
in.close();
out.close();
return 0;
}