Cod sursa(job #2176110)

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

#define N_MAX 100005

using namespace std;

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

int n, arr[N_MAX], lsi[N_MAX], p[N_MAX];

int binarySearch(int low, int high, int x);
void solve();

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

    solve();

    return 0;
}

int binarySearch(int low, int high, int x)
{
    while (low <= high)
    {
        int mid = low + (low - high) / 2;

        if (arr[lsi[mid]] < x)
            low = mid + 1;
        else
            high = mid - 1;
    }

    return low;
}

void solve()
{
    int len = 0;
    lsi[0] = arr[0];
    for (int i = 0; i <= n; i++)
    {
        int pos = binarySearch(1, len, arr[i]);
        // update parent for LIS
        p[i] = lsi[pos-1];
        // replace or append
        lsi[pos] = i;

        // update length of lsi
        if (pos > len)
            len = pos;
    }

    fout << len << "\n";
}