Pagini recente » Cod sursa (job #2906342) | Cod sursa (job #2778534) | Cod sursa (job #3005393) | Cod sursa (job #578120) | Cod sursa (job #2650723)
#include <cstdio>
using namespace std;
int numbers[100002], b[100002], parent[100002], best[100002];
int current_b;
void print_rec(int current) {
if (current == 0)
return;
print_rec(parent[current]);
printf("%d ", numbers[current]);
}
int bsearch(int current) {
int l = 0, r = current_b, mid = (l + r) / 2;
while (l < r) {
if (numbers[b[mid]] < numbers[current] && numbers[b[mid+1]] >= numbers[current])
return mid;
if (numbers[b[mid+1]] < numbers[current])
l = mid + 1;
else
r = mid - 1;
mid = (l + r) / 2;
}
return current_b;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out" ,"w", stdout);
int n, current_pos;
scanf("%d", &n);
for(int i=1; i<=n; ++i)
scanf("%d", &numbers[i]);
best[1] = b[1] = 1;
for(int i=2; i<=n; ++i) {
current_pos = bsearch(i);
b[current_pos+1] = i;
best[i] = current_pos + 1;
parent[i]= b[current_pos];
if (current_pos + 1 > current_b)
current_b = current_pos + 1;
}
int max = 0;
for(int i=1; i<=n; ++i)
if (best[i] > best[max])
max = i;
printf("%d\n", best[max]);
print_rec(max);
return 0;
}