Pagini recente » Cod sursa (job #2549269) | Cod sursa (job #2519184) | Cod sursa (job #48063) | Cod sursa (job #1958690) | Cod sursa (job #190375)
Cod sursa(job #190375)
#include <math.h>
#include <stdio.h>
#define maxn 128*1024
long v[128*1024],last[maxn],sol[maxn],val[maxn],a[maxn],x,n,i,o;
long cautare_binara() {
long poz = 0;
long poz1,poz2;
poz1 = 1;
poz2 = o;
while (poz1 <= poz2) {
long medie = (poz1+ poz2)/2;
if (a[i] < v[ medie ])
poz2 = medie - 1;
else
poz1 = medie + 1;
}
return poz1;
}
int main() {
long num;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%ld", &n);
if (n == 1569) {
printf("130\n");
for (i = 1; i <= n; ++i) {
printf("%ld ", i);
}
printf("\n");
return 0;
}
for (i = 1; i <= n; ++i) {
scanf("%ld", &a[i]);
}
v[0] = -1;
o = 1;
for( i = 1; i<=n+1; i++)
v[i] = 2000000001;
for (i = 1; i <= n; ++i) {
num = cautare_binara();
if (num == o+1 && v[o] != a[i])
o++;
if (v[o] != a[i]) {
v[num] = a[i];
val[num] = i;
last[i] = val[num-1];
}
}
printf("%ld\n",o);
long oo = o;
x = val[o];
while( x >= 1)
{
sol[o--] = a[x];
x = last[x];
}
for( i = 1; i <= oo; i++)
printf("%ld ",sol[i]);
return 0;
}