Cod sursa(job #2661397)

Utilizator piroComisia piro Data 21 octombrie 2020 22:38:14
Problema Subsir crescator maximal Scor 70
Compilator py Status done
Runda Arhiva educationala Marime 1.02 kb

def lis(a):

    n = len(a)

    longest = []
    prev = []

    for i in range(n):
        pos = bs(a[i], a, longest)
        if pos == len(longest):
            longest.append(i)
        if a[i] <= a[longest[pos]]:
            longest[pos] = i
        if pos > 0:
            prev.append(longest[pos-1])
        else:
            prev.append(-1)

    ans = []
    t = longest[-1]
    while t >= 0:
        ans.append(a[t])
        t = prev[t]
    ans.reverse()
    return ans

def bs(x, a, longest):

    p = 1
    n = len(longest)
    while p < n:
        p *= 2
    
    i = -1
    while p:
        if i + p < n:
            if a[longest[i + p]] < x:
                i += p
        p //= 2
    i += 1

    return i

def main():
    f = open("scmax.in", "r")
    _ = f.readline().split()
    v = list(map(int, f.readline().split()))
    f.close()
    out = lis(v)
    g = open("scmax.out", "w")
    g.writelines([
        str(len(out)), "\n",
        " ".join(map(str, out)), "\n",
    ])
    g.close()

if __name__ == "__main__":
    main()