Pagini recente » Cod sursa (job #2063726) | Cod sursa (job #1303683) | Cod sursa (job #2035733) | Cod sursa (job #1894715) | Cod sursa (job #3349811)
#include <bits/stdc++.h>
using namespace std;
int n, a[100001];
int lis[100001], best_len[100001], k = 0;
vector<int> ans;
void add_to_lis(int current_index, int element) {
if (k == 0) {
lis[++k] = element;
best_len[current_index] = 1;
return;
}
int st = 1, dr = k, poz = k + 1;
while (st <= dr) {
int middle = st + dr >> 1;
if (element <= lis[middle]) {
dr = middle - 1;
poz = middle;
}
else {
st = middle + 1;
}
}
lis[poz] = element;
if (poz == k + 1) ++k;
best_len[current_index] = poz;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
freopen("cmax.in", "r", stdin);
freopen("cmax.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
add_to_lis(i, a[i]);
}
cout << k << '\n';
for (int i = n; i >= 1; --i) {
if (best_len[i] == k) {
ans.push_back(a[i]);
--k;
}
}
reverse(ans.begin(), ans.end());
for (auto& i : ans) {
cout << i << ' ';
}
return 0;
}