Cod sursa(job #828808)

Utilizator lucian666Vasilut Lucian lucian666 Data 4 decembrie 2012 14:50:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb



//Vasilut
#include<fstream>
#include<algorithm>

#define NN 100010
using namespace std;

ofstream out("scmax.out");

int n,v[NN],l[NN],p[NN],bst[NN],number;

void read();
int cauta(int);
void solve();
void write_sol(int);

int main()
{
    read();
    solve();
    return 0;

}

void read()
{

    ifstream in("scmax.in");
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
        bst[1]=l[1]=1;
        l[0]=0;
        number=1;
}

int cauta(int x)
{

    int st,dr,mid;
    st = 0;
    dr = number;
    mid = ( st + dr ) >> 1 ;
        while( st <= dr )
        {

            if ( v[ l[mid] ] < x && v[ l[mid+1] ] >=x )
                return mid;
                else
                if ( v[ l[ mid+1 ] ] < x )
                {

                    st = mid + 1;
                    mid = ( st + dr ) >> 1;

                }
                else
                    {

                        dr =mid - 1;
                        mid = ( st + dr ) >> 1;

                    }
        }
        return number;
}

void solve()
{

    for(int i=1 ; i<=n ; i++ )
    {

        int poz = cauta ( v[i] );
        p[i] = l[ poz ];
        bst[ i ] = poz + 1;
        l [ poz + 1 ] = i;
            if ( number < poz + 1 )
            number = poz + 1;

    }
    int maxx ,poz ;
    maxx = poz = 0;
        for (int i =1 ;i<=n ;i++ )
            if ( bst[i] > maxx )
            {

                maxx = bst[i];
                poz = i;
            }
            out<<maxx<<'\n';
            write_sol(poz);

}


void write_sol(int i)
{

    if ( p[i] )
        write_sol( p[i] );
        out<<v[i]<< " " ;
}