Cod sursa(job #2485885)

Utilizator MaraPMara P MaraP Data 2 noiembrie 2019 10:28:08
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 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 poz)
{
    if(st==dr)
        return st;
    int mijl=(st+dr)/2;
    if(x[mijl]==values[poz])
        return mijl;
    if(x[mijl]<values[poz])
        return cautare_binara(mijl+1,dr,poz);
    return cautare_binara(st,mijl,poz);
}
void solve()
{
    positions[0]=0;
    x[0]=values[0];
    k_x++;
    for(int i=1;i<n;i++)
    {
        if(values[i]>values[i-1])
            positions[i]=positions[i-1]+1,x[k_x++]=values[i];
        else
        {
            int pos=cautare_binara(0,k_x-1,i);
            positions[i]=pos;
            x[pos]=values[i];
        }
        if(positions[i]>maximum)
            maximum=positions[i], position_maximum=i;
    }
}
void create_solution()
{
    int anterior=maximum;
    solution.push(values[position_maximum]);
    for(int i=position_maximum-1;i>=0;i--)
        if(positions[i]==anterior-1)
        {
            anterior=positions[i];
            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;
}