Cod sursa(job #639651)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 23 noiembrie 2011 18:35:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#define NMAX 100002

using namespace std;

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

int V[NMAX],N,L,sc[NMAX],T[NMAX];

void afiseaza(int i)
{
    if(T[i])
    afiseaza(T[i]);
    out<<V[i]<<' ';
}

int Cauta_pozitie(int key)
{
    int i,step;

    for(step=1;step<L;step<<=1);
    for(i=0;step;step>>=1)
    {
        if(i+step<=L)
            if(V[sc[i+step]]<key)
                i+=step;
    }
    return i;
}

int main()
{
    int i,j,q;
    in>>N;
    for(i=1;i<=N;i++)in>>V[i];

    sc[L=1] = 1;//cel mai lung subsir crescator format dintr-un element este elementul respectiv

    for(i=2;i<=N;i++)//care ar fi scmax daca as avea elementele 0..i
    {
        //caut binar cel mai mare element mai mic decat elementul meu
        q=Cauta_pozitie(V[i]);

        if(q == L)//pot adauga unul nou
            sc[++L] = i;

        else if(V[sc[q+1]]>V[i])//il pot "micsora" pe urmatorul
            sc[q+1]=i;

        T[i] = sc[q];
    }
    out<<L<<'\n';
    afiseaza(sc[L]);
    return 0;
}