Cod sursa(job #2236162)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 28 august 2018 14:04:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>
FILE *fin = freopen("scmax.in","r",stdin); FILE *fout = freopen("scmax.out","w",stdout);

static const int MAX_N = 1e5 + 5;

/* ========= DATA ========= */
int n, size;
int a[MAX_N], index[MAX_N], prev[MAX_N];
/* ========= DATA ========= */

void Read_Input()
{
    scanf("%d",&n);
    for(int i = 1; i<=n ;++i)
        scanf("%d",&a[i]);
}

void ConstructSubstring()
{
    int sol= 0;
    for(int i = 1; i<= n; ++i)
    {
        if(a[i] > a[index[size]])
        {
            index[++size]=i;
            prev[i] = index[size-1];
        }
        else
        {
            int left =1 , right = size, mid;
            while(left<=right)
            {
                mid = (left+right) >> 1;
                if(a[i] <= a[index[mid]])
                {
                    sol = mid;
                    right = mid - 1;
                }
                else
                    left = mid + 1;
            }
            index[sol] = i;
            prev[i] = index[sol-1];
        }
    }

}

void PrintSolution()
{
    std::vector<int> v;
    int x = index[size];
    while(x)
    {
        v.push_back(a[x]);
        x = prev[x];
    }
    printf("%d\n",size);
    for(int i = (int) v.size() -1; i>= 0; i--)
        printf("%d ", v[i]);
}

int main()
{
    Read_Input();
    ConstructSubstring();
    PrintSolution();

    return 0;
}