Pagini recente » Cod sursa (job #2780328) | Cod sursa (job #2125817) | Cod sursa (job #1064293) | Cod sursa (job #2785765) | Cod sursa (job #2865393)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[NMAX], L[NMAX], pred[NMAX], N, maxL = 1;
void read() {
fin >> N;
for (int i = 1; i <= N; ++i) {
fin >> a[i];
}
}
void solve() {
int left, right, mid;
L[maxL] = 1;
for (int i = 2; i <= N; ++i) {
left = 1; right = maxL;
while (left <= right) {
mid = (left + right) / 2;
if (a[L[mid]] < a[i]) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
L[left] = i;
pred[i] = L[left - 1];
if (left > maxL) {
maxL++;
}
}
}
void afis() {
int last = L[maxL];
fout << maxL << "\n";
vector<int> v;
for (int i = last; i > 0; i = pred[i]) {
v.push_back(a[i]);
}
for (int i = v.size() - 1; i >= 0; --i) {
fout << v[i] << " ";
}
fout << "\n";
}
int main()
{
read();
solve();
afis();
return 0;
}