Cod sursa(job #2279996)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 10 noiembrie 2018 10:54:34
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <stack>
#define N 100010

using namespace std;

int sol[N], ind, indices[N], input[N];
stack<int> solValues;

void binarySearch(int left, int right, int value)
{
    if (right <= left)
    {
        ind = left;
        return;
    }
    int middle = (left + right) / 2;
    if (sol[middle] > value)
        binarySearch(middle + 1, right, value);
    binarySearch(left, middle - 1, value);
}

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    int nr, solNr = 1;
    fin >> nr >> input[1];
    sol[1] = input[1];
    indices[1] = 1;
    for (int i=2; i<=nr; i++)
    {
        fin >> input[i];
        if (input[i] > sol[solNr])
            sol[++solNr] = input[i], indices[i] = solNr;
        else
        {
            binarySearch(1, solNr, input[i]);
            sol[ind] = input[i], indices[i] = ind;
        }
    }
    for (int i=nr, ind=solNr; i>=1 && ind>=1; i--)
    {
        if (indices[i] == ind)
        {
            solValues.push(input[i]);
            ind--;
        }
    }
    while(!solValues.empty())
    {
        fout << solValues.top() << " ";
        solValues.pop();
    }
    return 0;
}