import
java.util.*;
class
GFG
{
static
final
int
N =
10000
;
static
int
[] seg =
new
int
[
3
* N];
static
int
update(
int
in,
int
l,
int
r,
int
up_in,
int
val)
{
if
(r < up_in || l > up_in)
return
seg[in];
if
(l == up_in && r == up_in)
return
seg[in] = val;
int
m = (l + r) /
2
;
return
seg[in] = update(
2
* in +
1
, l, m, up_in, val) +
update(
2
* in +
2
, m +
1
, r, up_in, val);
}
static
int
query(
int
in,
int
l,
int
r,
int
l1,
int
r1)
{
if
(l > r)
return
0
;
if
(r < l1 || l > r1)
return
0
;
if
(l1 <= l && r <= r1)
return
seg[in];
int
m = (l + r) /
2
;
return
query(
2
* in +
1
, l, m, l1, r1) +
query(
2
* in +
2
, m +
1
, r, l1, r1);
}
static
int
findCnt(
int
[] arr,
int
n)
{
int
[] brr =
new
int
[n];
for
(
int
i =
0
; i < n; i++)
brr[i] = arr[i];
Arrays.sort(brr);
HashMap<Integer, Integer> r =
new
HashMap<Integer, Integer>();
for
(
int
i =
0
; i < n; i++)
r.put(brr[i], i +
1
);
int
dp[] =
new
int
[n];
int
ans =
0
;
for
(
int
i = n -
1
; i >=
0
; i--)
{
int
rank = r.get(arr[i]);
dp[i] =
1
+ query(
0
,
0
, n -
1
, rank, n -
1
);
ans += dp[i];
update(
0
,
0
, n -
1
, rank -
1
, dp[i] +
query(
0
,
0
, n -
1
, rank -
1
, rank -
1
));
}
return
ans;
}
public
static
void
main(String[] args)
{
int
arr[] = {
1
,
2
,
10
,
9
};
int
n = arr.length;
System.out.print(findCnt(arr, n));
}
}