Cod sursa(job #2291384)

Utilizator stefan.botezStefan Botez stefan.botez Data 27 noiembrie 2018 22:11:10
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>

using namespace std;

int binarySearch(int arr[], int l, int r, int x, int n)
{
   if (r >= l)
   {
        int mid = l + (r - l)/2;
        if(mid != n)
        {
            if (arr[mid] > x && arr[mid+1] <= x)
                return mid;
        }
        else if (arr[mid] > x)
            return mid;

        if (arr[mid] < x)
            return binarySearch(arr, l, mid-1, x, n);

        return binarySearch(arr, mid+1, r, x, n);
   }

   return -1;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    int n, v[100002], best[100002], r[100002], maxim;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &v[i]);
    best[n-1]=1;
    r[1] = v[n - 1];
    maxim = 1;
    for(int i = n - 2; i >= 0; i--)
    {
        int x = binarySearch(r, 1, maxim, v[i], maxim);
        if(x == -1)
        {
            best[i] = 1;
            if(r[1] < v[i])
                r[1] = v[i];
        }
        else{
          best[i] = x + 1;
          r[x + 1] = v[i];
          if(x + 1 > maxim)
            maxim = x + 1;
        }
    }

    printf("%d\n", maxim);
    int x, y, ok = 0;
    for(int i = 0; i < n; i++)
    {
        if(v[i] == r[maxim] && best[i] == maxim && ok == 0)
        {
            printf("%d ", v[i]);
            x = v[i];
            y = best[i];
            ok = 1;
        }
        if(v[i] > x && best[i] == y-1)
        {
            printf("%d ", v[i]);
            x = v[i];
            y = best[i];
        }
    }

    return 0;
}