Pagini recente » Cod sursa (job #2712786) | Cod sursa (job #2312046) | Cod sursa (job #3169127) | Cod sursa (job #2329335) | Cod sursa (job #841703)
Cod sursa(job #841703)
#include <stdio.h>
#define MAXN 100000
int v[MAXN],M[MAXN],P[MAXN];
int i,j,n,lmax;
// cauta cel mai mare l intre 1 si lmax astfel incat M[l] < val
int cauta_binar(int val)
{
int st=1,dr=lmax;
int mid;
while( st < dr ){
mid = (st+dr+1)/2;
if( v[M[mid]] >= val ){
dr = mid-1;
}
else if( v[M[mid]] < val ){
st = mid;
}
}
if( v[M[st]] < val )
return st;
else
return 0;
}
void print(int pos)
{
if( P[pos] != 0 )
print(P[pos]);
printf("%d ",v[pos]);
}
int main(int argc, char* argv[])
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&v[i+1]);
M[1] = 1;
P[0] = 0;
lmax = 1;
int l;
for(i=2;i<=n;i++){
l = cauta_binar(v[i]);
P[i] = M[l];
if( l == lmax || v[i] < v[M[l+1]] ){
M[l+1] = i;
if( l+1 > lmax )
lmax = l+1;
}
}
printf("%d\n",lmax);
print(M[lmax]);
return 0;
}