Cod sursa(job #661047)

Utilizator psycho21rAbabab psycho21r Data 13 ianuarie 2012 18:13:41
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
//Contacteaza-ma daca nu intelegi sursa
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

int main ()
{
    ifstream in("scmax.in");
    int N, a[100000], p[100000], l, r;

    in >> N;

    for (int i = 0; i < N; ++i)
        in >> a[i];
    in.close();

    vector <int> b;
    b.push_back(0);

    for (int i = 1; i < N; ++i)
    {
        if (a[b.back()] < a[i])
        {
            p[i] = b.back();
            b.push_back(i);
            continue;
        }

        for (l = 0, r = b.size() - 1; l < r;)
        {
            int c = (l + r)/2;
            if (a[b[c]] < a[i])
                l = c + 1;
            else
                r = c;
        }

        if (a[b[l]] > a[i])
        {
            if(l > 0)
                p[i] = b[l-1];
            b[l] = i;
        }
    }

    ofstream out("scmax.out");

    r = b.size(); l = b.back();
    stack <int> sol;

    while (r--)
    {
        sol.push(a[l]);
        l = p[l];
    }

    cout << sol.size() << "\n";

    while(!sol.empty())
    {
        cout << sol.top() << " ";
        sol.pop();
    }
    out.close();
    return 0;
}