Cod sursa(job #350522)

Utilizator alexandru92alexandru alexandru92 Data 24 septembrie 2009 16:13:46
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
/*
 * File:   main.cpp
 * Author: speedemon
 *
 * Created on September 19, 2009, 6:06 PM
 */
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define InFile "scmax.in"
#define OutFile "scmax.out"

/*
 *
 */

using namespace std;
ifstream in;
ofstream out;
vector<unsigned> v,b,p;
int main()
{unsigned N,x,i,st,dr,m;
    in.open(InFile);
    in>>N;
    while( N-- )
    {
        in>>x;
        v.push_back(x);
    }
    b.push_back(0);
    for( N=v.size(),i=1; i < N; ++i )
    {
        if( v[b.back()] < v[i] )
        {
            p.push_back(b.back());
            b.push_back(i);
            continue;
        }
        st=0; dr=b.size()-1;
        while( dr > st )
        {
            m=st+(dr-st)/2;
            if( v[i] < v[b[m]] ) dr=m-1;
            else st=m+1;
        }
        if( v[i] < v[b[st]] )
        {
            if( st > 0 ) p.push_back(b[st-1]);
            b[st]=1;
        }
    }
    out.open(OutFile);
    for( st=b.size(), dr=b.back(); st--; dr=p[dr] ) b[st]=v[dr];
    out<<b.size()<<'\n';
    sort( b.begin(), b.end() );
    copy( b.begin(), b.end(), ostream_iterator<unsigned>(out," ") );
    return EXIT_SUCCESS;
}