Cod sursa(job #1131533)

Utilizator mike96Mihai Babiac mike96 Data 28 februarie 2014 21:15:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;



int main()
{
    ifstream in("scmax.in");
    ofstream out("scmax.out");
    vector<int> vec;
    vector<int> tops;
    vector<vector<int> > stacks, backs;

    int n;

    in >> n;

    int a;
    for(int i = 0; i < n; i++)
    {
        in >> a;
        vec.push_back(a);
    }

    for(int i = 0; i < n; i++)
    {
        a = vec[i];
        vector<int>::iterator it;
        it = lower_bound(tops.begin(), tops.end(), a);

        if(it == tops.end())
        {
            tops.push_back(a);
            stacks.push_back(vector<int>());
            stacks.back().push_back(a);
            backs.push_back(vector<int>());
            if(backs.size() == 1)
                backs.back().push_back(-1);
            else
                backs.back().push_back(backs[backs.size()-2].size()-1);

        }
        else
        {
            int index = it - tops.begin();

            tops[index] = a;
            stacks[index].push_back(a);
            if(index > 0)
                backs[index].push_back(backs[index - 1].size() - 1);
            else
                backs[index].push_back(-1);
        }
    }

    out << stacks.size() << '\n';

    vector<int> result;
    result.resize(stacks.size());

    int idx = stacks.back().size() - 1;
    for(int i = stacks.size() - 1; i >= 0; i--)
    {
        result[i] = stacks[i][idx];
        idx = backs[i][idx];
    }

    for(int i = 0; i < result.size(); i++)
        out << result[i] << " ";

    return 0;
}