Cod sursa(job #727255)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 27 martie 2012 20:19:16
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#define nmax 100004
using namespace std;

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

int T[nmax],P[nmax],V[nmax],L,N;

void Afiseaza(int p)
{
    if(T[p])
        Afiseaza(T[p]);
    out<<V[p]<<' ';
}

inline int Cauta(int key)
{
    int st,step,i;
    for(st=1;st<L;st<<=1);
    for(step=st,i=0;step;step>>=1)
        if(i+step<=L&&V[P[i+step]]<key)
            i+=step;
    return i;
    /*int i,q;
    for(i=01;i<=L;i++)if(V[P[i]]>=key)return i-1;
    return L;*/
}

int main()
{
    int i,poz;
    in>>N;
    for(i=1;i<=N;i++)
        in>>V[i];
    //L = lungimea sibusirului crescator maximal
    //P[i] = pozitia ultimului element din subsirul crescator de lungime i
    P[L=1]=1;
    for(i=2;i<=N;i++)
    {
        poz = Cauta(V[i]);
        //out<<poz<<' ';
        if(poz==L)
            P[++L]=i;
        else if(V[P[poz+1]]>V[i])//il micsorez pe urmatorul
            P[poz+1]=i;
        T[i]=P[poz];
    }
    out<<L<<'\n';
    Afiseaza(P[L]);
    return 0;
}