import
java.util.*;
class
GFG
{
static
void
coordinateCompression(
int
arr[],
int
n)
{
Set<Integer> s =
new
HashSet<>();
for
(
int
i =
0
; i < n; i++)
{
s.add(arr[i]);
}
int
index =
0
;
HashMap<Integer, Integer> mp =
new
HashMap<Integer, Integer>();
for
(
int
itr : s)
{
index++;
mp.put(itr, index);
}
for
(
int
i =
0
; i < n; i++)
{
arr[i] = mp.get(arr[i]);
}
}
static
int
query(
int
BIT[],
int
index,
int
n)
{
int
ans =
0
;
while
(index >
0
)
{
ans = Math.max(ans, BIT[index]);
index -= index & (-index);
}
return
ans;
}
static
void
update(
int
BIT[],
int
index,
int
n)
{
int
x = query(BIT, index -
1
, n);
int
value = x +
1
;
while
(index <= n)
{
BIT[index] = Math.max(BIT[index], value);
index += index & (-index);
}
}
static
int
findLISLength(
int
arr[],
int
n)
{
coordinateCompression(arr, n);
int
[]BIT =
new
int
[n +
1
];
for
(
int
i =
0
; i <= n; i++)
{
BIT[i] =
0
;
}
for
(
int
i =
0
; i < n; i++)
{
update(BIT, arr[i], n);
}
int
ans = query(BIT, n, n);
return
ans;
}
public
static
void
main(String[] args)
{
int
arr[] = {
6
,
5
,
1
,
3
,
2
,
4
,
8
,
7
};
int
n = arr.length;
int
ans = findLISLength(arr, n);
System.out.println(ans);
}
}