Cod sursa(job #736231)

Utilizator BitOneSAlexandru BitOne Data 18 aprilie 2012 10:37:03
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011

using namespace std;

vector<int> v, w;
vector<int>::iterator it, iend;
int index[N_MAX], l[N_MAX], f[N_MAX], aib[N_MAX];

inline void Update(const int& N, int xIndex, const int& xValue)
{
    for(; xIndex <= N; xIndex+=(xIndex & -xIndex) )
        if(l[aib[xIndex]] < l[xValue])
            aib[xIndex]=xValue;
}
inline int Query(int xIndex)
{
    int m=0;

    for(; xIndex; xIndex-=(xIndex & -xIndex) )
        if(l[aib[xIndex]] > l[m])
            m=aib[xIndex];

    return m;
}
inline void Output(const int& x, ostream& out)
{
    if(0 == f[x])
        out<<v[x]<<' ';
    else {
            Output(f[x], out);
            out<<v[x]<<' ';
         }
}
int main()
{
    int N, i, maxIndex=0;
    ifstream in("scmax.in");
    ofstream out("scmax.out");

    in>>N;
    v.push_back(0);
    copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
    w=v;
    it=w.begin(), iend=w.end();
    sort(it, iend);
    iend=unique(it, iend);
    for(i=1; i <= N; ++i)
        index[i]=lower_bound(it, iend, v[i])-it;
    for(i=1; i <= N; ++i)
    {
        f[i]=Query(index[i]-1);
        l[i]=l[f[i]]+1;
        Update(N, index[i], i);
        if(l[i] > l[maxIndex])
            maxIndex=i;
    }
    out<<l[maxIndex]<<'\n';
    Output(maxIndex, out);
    out<<'\n';

    return EXIT_SUCCESS;
}