Pagini recente » Cod sursa (job #2744253) | Cod sursa (job #1280696) | Borderou de evaluare (job #2736523) | Cod sursa (job #1293392) | Cod sursa (job #922498)
Cod sursa(job #922498)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 100001;
int length;
int parent[MAXN];
int pos[MAXN];
int best[MAXN];
int v[MAXN];
int binary_search(int val)
{
int lo = 0, hi = length;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (v[pos[mid]] < val && val <= v[pos[mid + 1]]) {
return mid;
} else if (v[pos[mid + 1]] < val) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return length;
}
void print(int p)
{
if (parent[p] > 0)
print(parent[p]);
printf("%d ", v[p]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int N;
scanf("%d", &N);
for (int i = 1; i <= N; ++i)
scanf("%d", &v[i]);
length = 1;
best[1] = pos[1] = 1;
pos[0] = 0;
for (int i = 2; i <= N; ++i) {
int p = binary_search(v[i]);
parent[i] = pos[p];
best[i] = p + 1;
pos[p + 1] = i;
if (length < p + 1)
length = p + 1;
}
int max_len = 0, p = 0;
for (int i = 1; i <= N; ++i)
if (max_len < best[i]) {
max_len = best[i];
p = i;
}
printf("%d\n", max_len);
print(p);
printf("\n");
return 0;
}