Cod sursa(job #2208411)

Utilizator LivcristiTerebes Liviu Livcristi Data 29 mai 2018 17:35:51
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <vector>
#include <fstream>
#define NUM 100005
int v[NUM];
int ind_ult[NUM];
int ind_prev[NUM];
int n, lng, poz;
using namespace std;
ofstream g("scmax.out");
void afis(int i)
{
    if(i >= 0)
    {
        afis(ind_prev[i]);
        g << v[i] << " ";
    }
}
int Ceil(int st, int dr, int num)
{
    int m;
    while(dr - st > 1)
    {
        m = st + (dr - st) / 2;
        (v[ind_ult[m]] >= num) ? st = m : dr = m;
    }
    return m;
}
int main()
{
    ifstream f("scmax.in");
    f >> n;
    for(int i = 0; i < n; ++i)
        f >> v[i];
    for(int i = 0; i < n; ++i)
        ind_prev[i] = -1;
    lng = 1;
    for(int i = 1; i < n; ++i)
    {
        if(v[i] < v[ind_ult[0]])
            ind_ult[0] = i;
        else
        {
            if(v[i] > v[ind_ult[lng - 1]])
            {
                ind_prev[i] = ind_ult[lng - 1];
                ind_ult[lng++] = i;
            }
            else
            {
                poz = Ceil(-1, lng - 1, v[i]);
                ind_prev[i] = ind_ult[poz - 1];
                ind_ult[poz] = i;
            }
        }
    }
    g << lng << "\n";
    afis(ind_ult[lng - 1]);
    f.close();
}