Cod sursa(job #1825165)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 8 decembrie 2016 20:01:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100001],last[100001],q[100001],vf;
void adaug(int i)
{
    int st,dr,mij;
    if(vf==1)
    {
        if(v[q[1]]>v[i])
        {
            q[1]=i;
        }
        else
        {
            q[2]=i;
            vf=2;
            last[i]=q[1];
        }
        return ;
    }
    st=1;dr=vf;
    while(st<dr)
    {
        mij=st+dr;mij=mij/2;
        if(v[q[mij]]>v[i])
        {
            if(mij==dr)
                dr--;
            else
                dr=mij;
        }
        else
        {
            if(v[q[mij]]==v[i])
            {
                last[i]=last[q[mij]];
                return ;
            }
            else
            {
                if(mij==st)
                    st++;
                else
                    st=mij;
            }
        }
    }
    if(dr==vf && v[q[vf]]<v[i])
    {
        q[++vf]=i;
        last[i]=q[vf-1];
        return ;
    }
    if(v[q[st]]<v[i])
        return ;
    q[st]=i;
    last[i]=q[st-1];
}
void afisare(int var)
{
    if(last[var]!=0)
        afisare(last[var]);
    fout<<v[var]<<' ';

}
int main()
{
    int n,i,var;
    fin>>n;
    fin>>v[1];
    q[1]=1;vf=1;last[1]=0;
    for(i=2;i<=n;i++)
    {
        fin>>v[i];
        adaug(i);
    }
    fout<<vf<<'\n';
    var=q[vf];
    afisare(var);
    return 0;
}