Cod sursa(job #1684608)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 11 aprilie 2016 10:37:27
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int H[3200005],best[100005],nr[100005],i,N,indice[100005],maxim,c,p,rez[100005];
int detbest(int nod)
{
    if(nod>H[0])
        return 0;
    if(nr[H[nod]]<nr[i])
        {if(best[H[nod]]+1>best[indice[i]]+1) indice[i]=H[nod];return indice[i];}
    if(2*nod<=N&&2*nod+1<=N)
    {
            int a=0,b=0;
            if(best[2*nod]+1>best[indice[i]]+1)
                a=detbest(2*nod);
            if(best[2*nod+1]+1>best[indice[i]]+1)
                b=detbest(2*nod+1);
            if(best[a]>best[b])
                    b=a;
            if(b==0)
                ;
            else
                if(best[b]+1>best[indice[i]]+1)
                    {indice[i]=b;return b;}
            return 0;
    }
    if(2*nod<=N)
        if(best[2*nod]+1>best[indice[i]]+1)
            {
                int a=0;
                a=detbest(2*nod);
                if(a==0)
                    ;
                else
                    if(best[a]+1>best[indice[i]]+1)
                        {indice[i]=a;return a;}
                return 0;
            }
    return 0;
}
int main()
{
    fscanf(f,"%d",&N);
    for(i=1;i<=N;i++)
    {
        fscanf(f,"%d",&nr[i]);
        detbest(1);
        best[i]=best[indice[i]]+1;
        if(best[i]>best[maxim])
            maxim=i;
        H[++H[0]]=i;
        c=H[0];
        p=c/2;
        while(best[H[p]]<best[H[c]]&&p>0)
            {swap(H[c],H[p]);c=p;p=c/2;}
        p=c;
        while(1)
        {
            c=2*p;
            if(c>H[0])
                break;
            if(best[H[c+1]]>best[H[c]]&&c+1<=H[0])
                c=c+1;
            if(best[H[c]]<best[H[p]])
                break;
            swap(H[p],H[c]);
            p=c;
        }
    }
    fprintf(g,"%d\n",best[maxim]);
    while(maxim!=0)
    {
        rez[++rez[0]]=maxim;
        maxim=indice[maxim];
    }
    for(i=rez[0];i>0;i--)
        fprintf(g,"%d ",nr[rez[i]]);
    fclose(f);
    fclose(g);
    return 0;
}