Pagini recente » Cod sursa (job #241009) | Istoria paginii runda/infohard | Cod sursa (job #956362) | Cod sursa (job #1704192) | Cod sursa (job #493695)
Cod sursa(job #493695)
#include<cstdio>
int n,min[6000],urm[6000],a[6000],pred[6000],rez[6000];
void read()
{
freopen("subsir2.in","r",stdin);
freopen("subsir2.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
int edit(int x,int poz)
{
int ras=0;
if(pred[x]!=-1)
ras=edit(pred[x],poz-1);
if(ras)
{
rez[poz]=x;
}
else if(ras==0)
{
if(a[x]<a[rez[poz]])
{
ras=1;
rez[poz]=x;
}
else if(a[x]>a[rez[poz]])
ras=-1;
}
return x;
}
int minim(int x,int y)
{
return x<y?x:y;
}
void solve()
{
min[1]=1;
pred[1]=-1;
for(int i=2;i<=n;i++)
{
bool ok=true;
int m=10000,pozm,M=1000000000;
for(int j=1;j<i;j++)
if(a[j]<a[i] && min[j]<m && (urm[j]==0 || urm[j]>a[i]))
{
M=a[j];
m=min[j];
pozm=j;
ok=true;
}
else if(a[j]<a[i] && min[j]==m && (urm[j]==0 || urm[j]>a[i]))
{
if(a[j]<M)
{
M=a[j];
pozm=j;
}
}
if(ok==true)
{
pred[i]=pozm;
min[i]=min[pozm]+1;
urm[pozm]=a[i];
for(int j=1;j<i;j++)
if(a[j]<a[i] && urm[j]==0)
urm[j]=urm[i];
else if(a[j]<a[i] && urm[j])
urm[j]=minim(urm[j],a[i]);
continue;
}
min[i]=1;
pred[i]=-1;
}
int m=10000;
for(int i=1;i<=n;i++)
if(min[i]<m && urm[i]==0)
m=min[i];
printf("%d\n",m);
for(int i=1;i<=m;i++)
rez[i]=5999;
a[5999]=1000000000;
for(int i=1;i<=n;i++)
if(min[i]==m && urm[i]==0)
edit(i,m);
for(int i=1;i<=m;i++)
printf("%d ",rez[i]);
}
int main()
{
read();
solve();
return 0;
}