Pagini recente » Cod sursa (job #3324620) | Cod sursa (job #2047209) | Cod sursa (job #942730) | Cod sursa (job #1489066) | Cod sursa (job #3349812)
#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("scmax.in", "r", stdin);
freopen("scmax.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;
}