Cod sursa(job #2278138)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 7 noiembrie 2018 12:40:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 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 NMAX = 1e5 + 5;

// ======== DATA ========= 
int n, size;
int v[NMAX], index[NMAX], prev[NMAX];
// ======== DATA ========= 

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

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

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

    return;
}


int main()
{
    ReadInput();
    ConstructSubString();
    PrintSolution();

    return 0;
}