Cod sursa(job #752163)

Utilizator BitOneSAlexandru BitOne Data 27 mai 2012 22:37:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <vector>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>

using namespace std;

const int N_MAX=100011;

int f[N_MAX];
vector<int> v, TopMax;

inline void Output(ostream& out, int x)
{
    if(-1 == x)
        return;
    else {
            Output(out, f[x]);
            out<<v[x]<<" ";
         }
}
int main()
{
    int N, i, left, middle, right;
    ifstream in("scmax.in");
    ofstream out("scmax.out");

    in>>N;
    copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
    fill(f, f+N, -1);
    TopMax.push_back(0);
    for(i=1; i < N; ++i)
    {
        if(v[TopMax.back()] < v[i])
        {
            f[i]=TopMax.back();
            TopMax.push_back(i);
            continue;
        }
        left=0; right=TopMax.size()-1;
        while(left <= right)
        {
            middle=(left+right)>>1;
            if(v[i] == v[TopMax[middle]])
               break;
            if(v[i] < v[TopMax[middle]])
                right=middle-1;
            else left=middle+1;
        }
        if(v[TopMax[left]] > v[i])
        {
            if(left)
                f[i]=TopMax[left-1];
            TopMax[left]=i;
        }
    }
    out<<TopMax.size()<<'\n';
    Output(out, TopMax.back());

    return EXIT_SUCCESS;
}