Cod sursa(job #2485925)

Utilizator MaraPMara P MaraP Data 2 noiembrie 2019 10:41:46
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <stack>
#define MAXN 100005
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n,values[MAXN],x[MAXN],positions[MAXN];
int maximum=-1, position_maximum=-1;
int k_x;
stack <int> solution;

void citire()
{
    fin>>n;
    for(int i=0;i<n;i++)
        fin>>values[i];
}
int cautare_binara(int st, int dr, int value)
{
    if(st==dr)
        return st;
    int mijl=(st+dr)/2;
    if(x[mijl]==value)
        return mijl;
    if(x[mijl]<value)
        return cautare_binara(mijl+1,dr,value);
    return cautare_binara(st,mijl,value);
}
void solve()
{
    int current_position=1;
    x[0]=values[0];
    for(int i=1;i<n;i++)
    {
        int poz;
        if(values[i]>x[current_position-1])
        {
            poz=current_position;
            current_position++;
        }
        else
            poz=cautare_binara(0,current_position-1,values[i]);
        x[poz]=values[i];
        positions[i]=poz;
        if(poz>maximum)
        {
            maximum=poz;
            position_maximum=i;
        }
    }
}
void create_solution()
{
    int aux_max=maximum;
    for(int i=position_maximum;i>=0&&aux_max>=0;i--)
        if(positions[i]==aux_max)
        {
            aux_max--;
            solution.push(values[i]);
        }
}
void print_solution()
{
    fout<<maximum+1<<"\n";
    while(!solution.empty())
    {
        fout<<solution.top()<<" ";
        solution.pop();
    }
}
int main()
{
    citire();
    solve();
    create_solution();
    print_solution();
    return 0;
}