Pagini recente » Cod sursa (job #1523216) | Cod sursa (job #372712) | Cod sursa (job #2877256) | Cod sursa (job #210696) | Cod sursa (job #391430)
Cod sursa(job #391430)
#include<stdio.h>
#define DIM 100005
int n,b[DIM],vf,a[DIM],cut;
void solve (int poz)
{
int st=1,dr=vf,mij,max=0;
while(st<=dr)
{
mij=(st+dr)/2;
if(a[b[mij]]<a[poz])
{
max=mij;
st=mij+1;
}
else
dr=mij-1;
}
if(max==vf)
b[++vf]=poz;
else if(a[b[max+1]]>a[poz])
b[max+1]=poz;
}
void sol_construct (int poz)
{
int st=cut,dr=vf-1,mij,max;
while(st<=dr)
{
mij=(st+dr)/2;
if(a[b[mij]]<=a[poz])
{
max=mij;
st=mij+1;
}
else
dr=mij-1;
}
if(max==cut)// && a[b[max]]>a[poz])
b[--cut]=poz;
else if(a[b[max]]<a[poz])
b[cut=max]=poz;
}
int main ()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]);
solve (i);
}
cut=1;
if(vf!=n)
for(i=b[vf]-1;i>0;--i)
if(a[b[vf]]>a[i])
sol_construct (i);
printf("%d\n",vf);
for(i=cut;i<=vf;++i)
printf("%d ",a[b[i]]);
return 0;
}