Pagini recente » Cod sursa (job #1793636) | Cod sursa (job #2970761) | Cod sursa (job #2758371) | Cod sursa (job #2196635) | Cod sursa (job #1968229)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5 + 10;
const int inf = 2e9 + 10;
int n;
int a[nmax];
int best[nmax], frm[nmax];
void input() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
}
int search_pos(int left, int right, int x) {
int res = 0;
while (left <= right) {
int mid = left + (right - left) / 2;
if (a[best[mid]] >= x)
res = mid, right = mid - 1;
else left = mid + 1;
}
return res;
}
void compute_scmax() {
a[0] = inf;
for (int i = 1; i <= n; ++i) {
int pos = search_pos(1, i, a[i]);
if (pos == 0) continue;
best[pos] = i; frm[i] = best[pos-1];
}
}
void output() {
int ans;
for (ans = 0; best[ans+1]; ++ans);
printf("%d\n", ans);
vector < int > all;
for (int i = best[ans]; i; i = frm[i])
all.push_back(a[i]);
reverse(all.begin(), all.end());
for (auto &it: all) printf("%d ", it);
printf("\n");
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
input();
compute_scmax();
output();
return 0;
}