Cod sursa(job #2175956)

Utilizator SaphyrosMarcus Sergiu David Saphyros Data 16 martie 2018 20:08:06
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cstring>

#define MAXN 100005

using namespace std;

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

int n, arr[MAXN], t[MAXN], r[MAXN];

int binaryCeil(int end, int s);
void lsi();

int main()
{
    fin >> n;
    for (int i = 0; i < n; i++)
        fin >> arr[i];

    lsi();

    return 0;
}

int binaryCeil(int end, int s)
{
    int start = 0;
    int m;
    int len = end;
    while (start <= end)
    {
        m = (start + end) / 2;
        if (m < len && arr[t[m]] < s && s <= arr[t[m+1]])
        {
            return m+1;
        }
        else if (arr[t[m]] < s)
        {
            start = m + 1;
        }
        else
        {
            end = m - 1;
        }
    }
    return -1;
}

void lsi()
{
    memset(r, -1, MAXN);
    t[0] = 0;
    int len = 0;
    for (int i = 1; i < n; i++)
    {
        if (arr[t[0]] > arr[i])
        {
            t[0] = i;
        }
        else if (arr[t[len]] < arr[i])
        {
            len++;
            t[len] = i;
            r[t[len]] = t[len-1];
        }
        else
        {
            int index = binaryCeil(len, arr[i]);
            t[index] = i;
            r[t[index]] = t[index-1];
        }
    }

    int index = t[len];
    fout << len+1 << "\n";
    while (index != -1)
    {
        fout << arr[index] << " ";
        index = r[index];
    }
}