Pagini recente » Cod sursa (job #1071379) | Cod sursa (job #1621084) | Cod sursa (job #132959) | Cod sursa (job #1746604) | Cod sursa (job #2449541)
#!/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)))