Pagini recente » Cod sursa (job #2540977) | Cod sursa (job #2216404) | Cod sursa (job #2554314) | Cod sursa (job #2486732) | Cod sursa (job #750467)
Cod sursa(job #750467)
#include<cstdio>
using namespace std;
int i, a[100001], p[100001], q[100001], n, m;
int cb(int x, int st, int dr){
int mij, pz;
pz=0;
while ((st<=dr)&&(pz==0)) {
mij=(st+dr)/2;
if (q[mij]==x) pz=mij; else
if (q[mij]<x) st=mij+1; else dr=mij-1;
}
if (pz==0) return st; else return pz;
}
void scrie(int poz, int x, int ult){
if (poz>0) {
if ((p[poz]==x)&&(ult>a[poz])) {
scrie(poz-1, x-1, a[poz]);
printf("%d ", a[poz]);
}
else scrie(poz-1, x, ult);
}
}
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[0]=1; q[1]=a[1];
for (i=2;i<=n;i++) {
m=cb(a[i], 1, q[0]);
if (m>q[0]) {q[0]++; p[i]=q[0]; q[q[0]]=a[i];} else {q[m]=a[i]; p[i]=m;}
}
printf("%d\n", q[0]);
scrie(n, q[0], 1000000000);
return 0;
}