Pagini recente » Cod sursa (job #2470518) | Cod sursa (job #295619) | Cod sursa (job #944753) | Cod sursa (job #295624) | Cod sursa (job #3344939)
#include <iostream>
#define NMAX 100005
int bsearch(int *t, int n, int *v, int x)
{
int l, m, r;
l = 0;
r = n - 1;
while (l <= r) {
m = l + ((r - l) >> 1);
if (x <= v[t[m]])
r = m - 1;
else
l = m + 1;
}
return l;
}
void print_sequence(int *v, int *p, int i)
{
if (p[i] != -1)
print_sequence(v, p, p[i]);
std::cout << v[i] << ' ';
}
int main()
{
int n, m = 0;
int v[NMAX];
int t[NMAX]; // minimum possible tail value for an increasing subsequence of length l
int p[NMAX];
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
std::cin >> n;
for (int i = 0; i < n; ++i)
p[i] = -1;
for (int i = 0, j; i < n; ++i) {
std::cin >> v[i];
j = bsearch(t, m, v, v[i]);
t[j] = i;
if (j > 0)
p[i] = t[j - 1];
if (j == m)
++m;
}
std::cout << m << '\n';
print_sequence(v, p, t[m - 1]);
std::cout << '\n';
return 0;
}