Pagini recente » Cod sursa (job #2175803) | Cod sursa (job #3137538) | Cod sursa (job #2626038) | Cod sursa (job #2421918) | Cod sursa (job #748937)
Cod sursa(job #748937)
#include<cstdio>
using namespace std;
int i, primu, p[100001], q[100001], z, j, a[100001], n;
bool ok;
void cb(int st, int dr){
int mij=(st+dr)/2;
if ((a[i]<=q[mij])&&(a[i]>q[mij+1])) {p[z]=mij; q[mij]=a[i];} else
if (a[i]<q[mij]) cb(mij, dr); else cb(st, mij);
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout); z=1;
scanf("%d", &n); q[0]=1; scanf("%d", &a[1]); q[1]=a[1]; p[1]=1; p[0]=1;
for (i=2;i<=n;i++) {
scanf("%d", &a[i]); z++;
if (a[i]>q[q[0]]) {p[z]=q[0]+1; q[++q[0]]=a[i];}
else
if (a[i]<q[1]) {p[z]=1; q[1]=a[i];}
else
if (q[0]<5) {
for (j=1;j<=n;j++)
if (a[i]<=q[j]) {
p[z]=j; q[j-1]=a[i];}
}
else cb(1, q[0]);
} z=1;
if (q[1]==a[1]) primu=1; else primu=2;
printf("%d\n", q[0]); for (i=primu;i<=n;i++) if (p[i]==z) {z++; printf("%d ", a[i]);}
return 0;
}