Cod sursa(job #2646483)

Utilizator DormeoNoapte Buna Dormeo Data 1 septembrie 2020 12:31:40
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

const int DIM = 100000 + 5;

int a[DIM], scm[DIM], dad[DIM];

int bs(int x)
{
    int left = 1, right = scm[DIM - 1], mx = 0;

    while(left <= right) {
        int mid = (left + right) >> 1;
        if(x > a[scm[mid]]) left = mid + 1, mx = max(mx, mid);
        else right = mid - 1;
    }

    return mx;
}

void path(int k)
{
    if(dad[k] != 0) path(dad[k]);
    printf("%d ", a[k]);
}

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

    int n;

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

    scm[1] = 1;
    scm[DIM - 1] = 1;
    for(int i = 2; i <= n; ++i) {
        int pos = bs(a[i]);
        scm[pos + 1] = i;
        dad[i] = scm[pos];
        scm[DIM - 1] = max(pos + 1, scm[DIM - 1]);
    }

    printf("%d\n", scm[DIM - 1]);
    path(scm[scm[DIM - 1]]);
    return 0;
}