import
java.util.*;
class
Main {
static
class
Pair<K, V> {
public
K key;
public
V value;
public
Pair(K key, V value) {
this
.key = key;
this
.value = value;
}
public
K getKey() {
return
key;
}
public
V getValue() {
return
value;
}
}
public
static
ArrayList<Integer> maxSubsequence(ArrayList<Integer> arr,
int
K) {
int
N = arr.size();
ArrayList<Pair<Integer, Integer>> dp =
new
ArrayList<Pair<Integer,
Integer>>(N);
for
(
int
i =
0
; i < N; i++) {
dp.add(
new
Pair<Integer, Integer>(
1
, -
1
));
}
HashMap<Integer, Integer> mp =
new
HashMap<Integer, Integer>();
mp.put(arr.get(
0
),
1
);
int
maxlen =
1
, ind =
0
;
for
(
int
i =
1
; i < N; i++) {
if
(mp.containsKey(arr.get(i) - K)) {
dp.set(i,
new
Pair<Integer,
Integer>(dp.get(mp.get(arr.get(i) - K) -
1
).getKey() +
1
,
mp.get(arr.get(i) - K) -
1
));
}
if
(mp.containsKey(arr.get(i) + K)) {
if
(dp.get(i).getKey() <
dp.get(mp.get(arr.get(i) + K) -
1
).getKey() +
1
) {
dp.set(i,
new
Pair<Integer,
Integer>(dp.get(mp.get(arr.get(i) + K) -
1
).getKey() +
1
,
mp.get(arr.get(i) + K) -
1
));
}
}
if
(maxlen < dp.get(i).getKey()) {
maxlen = dp.get(i).getKey();
ind = i;
}
mp.put(arr.get(i), i +
1
);
}
ArrayList<Integer> v =
new
ArrayList<Integer>();
while
(ind >=
0
) {
v.add(arr.get(ind));
ind = dp.get(ind).getValue();
}
Collections.reverse(v);
return
v;
}
public
static
void
main(String[] args) {
ArrayList<Integer> arr =
new
ArrayList<Integer>(Arrays.asList(
4
,
6
,
7
,
8
,
9
,
8
,
12
,
14
,
17
,
15
));
int
K =
2
;
ArrayList<Integer> longSubseq = maxSubsequence(arr, K);
for
(
int
i : longSubseq)
System.out.print(i +
" "
);
System.out.println();
}
}