Pagini recente » Cod sursa (job #450484) | Cod sursa (job #2111743) | Cod sursa (job #2405120) | Cod sursa (job #3207935) | Cod sursa (job #536733)
Cod sursa(job #536733)
#include<cstdio>
#include<cstdlib>
#define mare 1<<31 // 2 la puterea 31 // ox3fffffff
using namespace std;
typedef int vector[100001];
vector v,p,q;
int *s,n,nq;
void read()
{ freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for(int i=1;i<=n;++i) scanf("%d", &v[i]);
}
int insbin(int k,int x, int y)
{ int mij=(x+y)/2;
if(x==y){
if(y>nq)
q[++nq+1]=mare;
q[x]=k;
return x;
}
else if(k<=q[mij]) return insbin(k,x,mij); //
else return insbin(k,mij+1,y);
}
void creare_pq()
{ nq=0;q[1]=mare;
for (int i=1; i<=n; ++i)
p[i]=insbin(v[i],1,nq+1);
}
void cautsol()
{ int i,k=n;
s=(int*)calloc(nq+1,sizeof(int));
for(i=nq;i;--i)
{ while(p[k]!=i) --k;
*(s+i)=v[k];
}
}
void scriu_sol()
{ freopen("scmax.out","w",stdout);
printf("%d\n", nq);
for(int i=1;i<=nq;++i) printf("%d ", *(s+i) );
printf("\n");
}
int main()
{ read();
creare_pq();
cautsol();
scriu_sol();
return 0;
}