Cod sursa(job #2449541)

Utilizator voyagerSachelarie Bogdan voyager Data 20 august 2019 00:23:55
Problema Subsir crescator maximal Scor 70
Compilator py Status done
Runda Arhiva educationala Marime 1.08 kb
#!/usr/bin/env python3

import sys
sys.stdout = open('scmax.out', 'w')

with open('scmax.in', 'r') as f:
    N = int(f.readline())

    def update(i, ind):
        while i <= P:
            if dp[ind] > dp[bit[i]]:
                bit[i] = ind
            i += i & -i
    def query(i):
        mx = 0
        while i > 0:
            if dp[bit[i]] > dp[mx]:
                mx = bit[i]
            i -= i & -i
        return mx

    up, dp, norm = [-1] * (N + 1), [0] * (N + 1), [0] * N
    orig = list(map(int, f.readline().split()))
    v = sorted((x, i + 1) for i, x in enumerate(orig))

    P = 1
    for i, x in enumerate(v):
        if i > 0 and x[0] != v[i-1][0]:
            P += 1
        norm[x[1] - 1] = P
    bit = [0] * (P + 1)

    for i, x in enumerate(norm):
        up[i + 1] = query(x - 1)
        dp[i + 1] = dp[up[i + 1]] + 1
        update(x, i + 1)

    bst = 0
    for x in range(1, N + 1):
        if dp[x] > dp[bst]:
            bst = x

    print(dp[bst])
    i, sol = bst, []
    while i:
        sol.append(str(orig[i - 1]))
        i = up[i]
    print(' '.join(reversed(sol)))