Cod sursa(job #493695)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 19 octombrie 2010 02:08:36
Problema Subsir 2 Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#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;
}