Cod sursa(job #2176286)

Utilizator SaphyrosMarcus Sergiu David Saphyros Data 16 martie 2018 22:13:02
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

#define N_MAX 100005

using namespace std;

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

int n, arr[N_MAX], best[N_MAX], p[N_MAX], mx, k, L[N_MAX], len;

void tip(int i)
{
    if (p[i] > 0)
    {
        tip(p[i]);
    }
    fout << arr[i] << " ";
}

int bS(int x)
{
    int low, high, mid;
    low = 0;
    high = len;
    mid = low + (low - high) / 2;
    while (low <= high)
    {
        if (arr[L[mid]] < x && arr[L[mid+1]] >= x)
        {
            return mid;
        }
        else if (arr[L[mid+1]] < x)
        {
            low = mid + 1;
            mid = low + (low - high) / 2;
        }
        else
        {
            high = mid - 1;
            mid = low + (low - high) / 2;
        }
        return len;
    }
}

int main()
{
    int i, j, pos;
    len = 1;
    
    fin >> n;
    for (i = 1; i <= n; i++)
    {
        fin >> arr[i];
    }
    best[1] = L[1] = 1;
    L[0] = 0;
    
    for (i = 2; i <= n; i++)
    {
        pos = bS(arr[i]);
        p[i] = L[pos];
        best[i] = pos + 1;
        L[pos + 1] = i;
        if (len < pos + 1)
        {
            len = pos + 1;
        }
    }
    mx = 0;
    pos = 0;
    for (i = 1; i <= n; i++)
    {
        if (mx < best[i])
        {
            mx = best[i];
            pos = i;
        }
    }
    
    fout << mx << "\n";
    tip(pos);

    return 0;
}