Pagini recente » Cod sursa (job #2595406) | Cod sursa (job #321319) | Cod sursa (job #3156616) | Cod sursa (job #1056828) | Cod sursa (job #750370)
Cod sursa(job #750370)
#include<cstdio>
using namespace std;
int i, m, n, j, a[100001], p[100001], q[100001];
int cb(int st, int dr, int mi){
int mij=(st+dr)/2;
if (dr-st<=1) {m=mi; return 0;}
if (q[mij]<a[i]) cb(mij, dr, mij); else cb(st, mij, mi);
}
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]); p[i]=0; q[i]=0;}
p[1]=1; q[1]=a[1]; q[0]=1;
for (i=2;i<=n;i++) {
m=-1;
if (q[0]<=2) {
for (j=1;j<=q[0];j++) if (a[i]<=q[j]) {m=j; break;}
if (m<0) {p[i]=q[0]+1; q[0]++; q[q[0]]=a[i];}
if (m>0) q[m]=a[i];
} else if (a[i]<q[1]) {q[1]=a[i]; p[i]=1;} else
{
cb(1, q[0], 2);
if (m<0) {
p[i]=q[0]+1; q[0]++; q[q[0]]=a[i];
}
if (m>0) q[m]=a[i];
}
}
printf("%d\n", q[0]); m=1;
for (i=1;i<=n;i++) {if (p[i]==m) {m++; printf("%d ", a[i]);} if (m>q[0]) break;}
printf("\n");
return 0;
}