Pagini recente » Cod sursa (job #2750829) | Cod sursa (job #1414517) | Cod sursa (job #1955144) | Cod sursa (job #1015366) | Cod sursa (job #2908253)
#include <stdio.h>
#define MAX_N 100010
int n,m,i,j,k,poz,p,q,max;
int a[MAX_N],st[MAX_N],d[MAX_N];
int caut(int x) {
p = 0; q = m + 1;
int sol = 0,r = 0;
while (p + 1 < q) {
r = (p + q) / 2;
if (st[r] >= a[i]) sol = q = r;
else if (st[r] < a[i])
p = r;
}
return sol;
}
void afis(int poz, int val) {
if (val == 0) return;
for (int i = poz - 1; i >= 1; i--)
if (d[i] == val && a[i] < a[poz]) {
afis(i, val - 1);
printf("%d ",a[i]);
break;
}
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (i = 1; i <= n; i++)
scanf("%d",&a[i]);
for (i = 1; i <= n; i++) {
poz = caut(a[i]);
if (!poz) poz = ++m;
st[poz] = a[i];
d[i] = poz;
}
for (i = 1; i <= n; i++)
if (d[i] > max) {
max = d[i];
p = i;
}
printf("%d\n",max);
a[n + 1] = a[p] + 1;
afis(n + 1,max);
printf("\n");
return 0;
}