Cod sursa(job #2137809)

Utilizator mihnea00Duican Mihnea mihnea00 Data 21 februarie 2018 02:57:49
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
//la ce m-am gandit eu...

#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int v[100010],from,Max,n,poz,capat_idxsi[100010],inapoi[100010],x,idx,i;

int bagam_binara(int x,int stg,int drt)
{
    int mijl=0;
    while(stg<drt)
    {
        mijl=(stg+drt)/2;
        if(x<=v[capat_idxsi[mijl]])
        {
            drt=mijl;
        }
        else
        {
            stg=mijl+1;
        }
    }
    return stg;
}

void aff(int from)
{
    if(inapoi[from]!=0)
        aff(inapoi[from]);
    fout<<v[from]<<" ";
}

int main()
{
    fin>>n;
    for(i=1;i<=n;++i)
    {
        fin>>v[i];
    }

    capat_idxsi[1]=1;
    //inapoi[1]=0;
    idx=1;

    for(i=2;i<=n;++i)
    {
        if(v[capat_idxsi[idx]]<v[i])
        {
            ++idx;
            capat_idxsi[idx]=i;
            inapoi[i]=capat_idxsi[idx-1];
            from=i;
        }
        else
        {
            if(v[capat_idxsi[1]]>v[i])
            {
                capat_idxsi[1]=i;
                inapoi[i]=0;
                //inapoi[i]=0;
            }
            else
            {
                poz=bagam_binara(v[i],1,idx);
                capat_idxsi[poz]=i;
                inapoi[i]=capat_idxsi[poz-1];
                //best[i]=poz;
            }
        }
    }
    fout<<idx<<"\n";
    aff(from);
    /*for(i=1;i<=n;++i)
    {
        if(best[i]>Max)
        {
            fout<<v[i]<<" ";
            Max=best[i];
        }
    }*/


    return 0;
}