Cod sursa(job #350954)

Utilizator alexandru92alexandru alexandru92 Data 26 septembrie 2009 13:35:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
/*
 * File:   main.cpp
 * Author: speedemon
 *
 * Created on September 19, 2009, 6:06 PM
 */
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>

/*
 *
 */

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