Cod sursa(job #2254243)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 4 octombrie 2018 21:58:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

int v[100005];
int b[100005];
int p[100005];
int a[100005];
int n, lv;

int cautbin(int val)
{
    int st = 0, dr = lv, mij, rez = -1;
    while(dr >= st)
    {
        mij = (st + dr) / 2;
        if(v[mij] < val)
        {
            rez = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    return rez + 1;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++)
    {
        int pos = cautbin(a[i]);
        v[pos] = a[i];
        p[pos] = i;
        if(pos != 1)
            b[i] = p[pos - 1];
        else b[i] = -1;
        if(pos > lv)
            lv++;
    }
    int lg = 0, c;
    for(c = p[lv]; b[c] != -1; c = b[c])
        v[lg++] = a[c];
    v[lg++] = a[c];
    printf("%d\n", lg);
    for(int i = lg - 1; i >= 0; i--)
        printf("%d ", v[i]);
    return 0;
}