Pagini recente » Cod sursa (job #251020) | Cod sursa (job #54841) | Cod sursa (job #1584201) | Cod sursa (job #1874955) | Cod sursa (job #262959)
Cod sursa(job #262959)
#include<stdio.h>
int st,dr,x[100000],t,pred[100000],n,i,j=0,v[100000],rez[100000];
/*void cauta(int w[],int &st,int dr,int dc)
{
int m;
while(st<dr)
{
m=(st+dr)/2;
if(dc<=w[m])
dr=m;
else
st=m+1;
}
}*/
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
{
if(v[i]>v[x[j]])
{
x[j+1]=i;
pred[i]=x[j];
j++;
continue;
}
if(v[i]<=v[x[1]])
{
x[1]=i;
pred[i]=0;
continue;
}
st=1;
dr=j;
int m;
while(st<dr)
{
m=(st+dr)/2;
if(v[i]<=v[x[m]])
dr=m;
else
st=m+1;
}
if(v[x[st]]==v[i])
{
x[st]=i;
pred[i]=x[st-1];
}
else
{
x[st-1]=i;
pred[i]=x[st-2];
}
}
printf("%d\n",j);
t=j;
for(i=j;i>0;i--)
{
rez[i]=v[x[j]];
x[j]=pred[x[j]];
}
for(i=1;i<=j;i++)
printf("%d ",rez[i]);
return 0;
}