Cod sursa(job #2254770)

Utilizator iulius510iulius alexandru iulius510 Data 5 octombrie 2018 22:32:15
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int T[1000001],n,v[1000001],d[1000001],sol[1000001],p;
int M;
void afis(int x)
{
    if(sol[x])
        afis(sol[x]);
    g<<v[x]<<' ';
}
void ad(int a,int b,int k,int piv,int x)
{
    if(a==k&&b==k)
    {
        T[piv]=x;
    }
    else
    {
        if(k<=(a+b)/2)
            ad(a,(a+b)/2,k,2*piv,x);
        else

            ad((a+b)/2+1,b,k,2*piv+1,x);
        if(d[T[2*piv+1]]>d[T[2*piv]])
            T[piv]=T[2*piv+1];
        else
            T[piv]=T[2*piv];
    }


}
void af_max(int a,int b,int y,int z,int piv,int capat,int &M,int &rad)
{
    if(a>=y&&b<=z)
    {
        if(v[T[piv]]<capat)
        {
            if(d[T[piv]]>M)
            {
                M=d[T[piv]];
                rad=T[piv];
            }
        }
        else
        {
            af_max(a,(a+b)/2,y,z,2*piv,capat,M,rad);
            af_max((a+b)/2+1,b,y,z,2*piv+1,capat,M,rad);
        }
    }
    else
    {
        if((a>=y&&a<=z)||(y<=b&&b<=z)||(a<=y&&z<=b))
        {
            af_max(a,(a+b)/2,y,z,2*piv,capat,M,rad);
            af_max((a+b)/2+1,b,y,z,2*piv+1,capat,M,rad);
        }
    }
}
int main()
{
    f>>n;
    for(int i=1; i<=n; i++)
    {
        f>>v[i];
    }
    d[1]=1;
    ad(1,n,1,1,1);
    for(int k=2; k<=n; k++)
    {
        af_max(1,n,1,k-1,1,v[k],d[k],sol[k]);
        ++d[k];
        ad(1,n,k,1,k);
        if(M<d[k])
        {
            p=k;
            M=d[k];
        }

    }
    g<<M;
    g<<'\n';
    afis(p);
    return 0;
}