Cod sursa(job #775026)

Utilizator SteveStefan Eniceicu Steve Data 7 august 2012 06:11:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>

using namespace std;

int N, v[100005], L = 0;
int M[100005];
int P[100005];
vector <int> rasp;

void Citire () {
    ifstream fin ("scmax.in");
    fin >> N;
    for (int i = 1; i <= N; i++)
        fin >> v[i];
    fin.close ();
}

int B_Search (int dog) {
    int i = 0, step = 1 << 17;
    for (; step; step >>= 1)
        if (i + step <= L && v[M[i + step]] < v[dog]) i += step;
    return i;
}

void Business () {
    int j;
    for (int i = 1; i <= N; i++)
    {
        j = B_Search (i);
        P[i] = M[j];
        if (j == L || v[i] < v[M[j + 1]])
        {
            M[j + 1] = i;
            L = max (L, j + 1);
        }
    }
}

void Scriere () {
    ofstream fout ("scmax.out");
    fout << L << "\n";
    int a = M[L];
    while (a > 0)
    {
        rasp.push_back (v[a]);
        a = P[a];
    }
    while (!rasp.empty ())
    {
        fout << rasp.back () << " ";
        rasp.pop_back ();
    }
    fout.close ();
}

int main () {
    Citire ();
    Business ();
    Scriere ();
    return 0;
}