-
Notifications
You must be signed in to change notification settings - Fork 3
/
longincsubseq.py
43 lines (38 loc) · 969 Bytes
/
longincsubseq.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys
def lis(arr):
def upper_bound(sub, idx):
lo, hi = 0, len(sub) - 1
while hi > lo:
mid = (lo + hi) // 2
if arr[sub[mid]] < arr[idx]:
lo = mid + 1
else:
hi = mid
return hi
temp = []
par = [None] * len(arr)
for i in range(len(arr)):
if not temp or arr[i] > arr[temp[-1]]:
if temp:
par[i] = temp[-1]
temp.append(i)
else:
rep = upper_bound(temp, i)
temp[rep] = i
if rep != 0:
par[i] = temp[rep - 1]
final = []
curr = temp[-1]
while curr != None:
final.append(curr)
curr = par[curr]
return final[::-1]
skip = input()
for line in sys.stdin:
k = lis(list(map(int, line.split())))
print(len(k))
print(*k)
try:
skip = input()
except:
pass