Pagini recente » Cod sursa (job #3350154) | Cod sursa (job #2584983) | Cod sursa (job #3131658) | Cod sursa (job #560333) | Cod sursa (job #3349815)
#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;
}
void afis(int i, int k) {
if (i == 0) {
return;
}
if (best_len[i] == k && k != 0) {
afis(i-1, k-1);
cout << a[i] << ' ';
}
afis(i - 1, k);
return;
}
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';
afis(n, k);
return 0;
}