Pagini recente » Cod sursa (job #3253583) | Cod sursa (job #1503517) | Cod sursa (job #1484384) | Cod sursa (job #1680407) | Cod sursa (job #483263)
Cod sursa(job #483263)
#include <stdio.h>
#include <math.h>
long n, v[100010], a[100010], last[100010], din[100010], dex[100010], val, i, max;
long BSearch (long num) {
long ll = 0, rl = dex[0], sol = 0;
while (ll < rl) {
long mid = (ll + rl) / 2 + 1;
if (a[dex[mid]] >= num) {
rl = mid - 1;
} else {
ll = mid;
sol = mid;
}
}
return sol;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%ld", &n);
din[0] = 1;
din[1] = 1;
a[0] = 2000000010;
for (i = 1; i <= n; ++i) {
scanf("%ld", &a[i]);
if (i == 1) {
dex[ 0 ] = 1;
dex[1] = i;
last[ 1 ] = 0;
continue;
}
din[i] = BSearch(a[i]) + 1;
if (dex[din[i]] == 0) ++dex[0];
dex[din[i]] = i;
last[i] = dex[din[i] - 1];
if( din[ i ] == 1) last[ i ] = 0;
}
printf("%ld\n", dex[0]);
long co = dex[dex[0]];
do {
v[++v[0]] = a[co];
co = last[co];
} while (co != 0);
for (i = v[0]; i >= 1; --i) {
printf("%ld ", v[i]);
}
/*for (i = 2; i <= dex[0]; ++i) {
printf("%ld ", a[last[i]]);
}*/
//printf("%ld\n", a[dex[dex[0]]]);
return 0;
}