Pagini recente » Cod sursa (job #3224999) | Cod sursa (job #2613330) | Cod sursa (job #1411986) | Borderou de evaluare (job #2912076) | Cod sursa (job #2661397)
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()