import
java.util.*;
public
class
Main {
static
long
power(
long
x,
long
y,
long
mod)
{
long
res =
1
;
x = x % mod;
while
(y >
0
) {
if
((y &
1
) ==
1
)
res = (res * x) % mod;
y = y >>
1
;
x = (x * x) % mod;
}
return
res;
}
static
long
countOfPartitions(
int
[] arr)
{
int
N = arr.length;
HashMap<Integer, Integer> firstOcc
=
new
HashMap<>();
HashMap<Integer, Integer> lastOcc =
new
HashMap<>();
for
(
int
i =
0
; i < N; i++) {
if
(!firstOcc.containsKey(arr[i]))
firstOcc.put(arr[i], i +
1
);
lastOcc.put(arr[i], i +
1
);
}
ArrayList<Map.Entry<Integer, Integer> > segments
=
new
ArrayList<>();
for
(Map.Entry<Integer, Integer> entry :
firstOcc.entrySet()) {
int
key = entry.getKey();
int
value = entry.getValue();
segments.add(
new
AbstractMap.SimpleEntry<>(
value, lastOcc.get(key)));
}
segments.sort(
Comparator.comparing(Map.Entry::getKey));
int
index =
0
;
for
(
int
i =
1
; i < segments.size(); i++) {
if
(segments.get(index).getValue()
>= segments.get(i).getKey()) {
segments.get(index).setValue(
Math.max(segments.get(index).getValue(),
segments.get(i).getValue()));
}
else
{
index++;
segments.set(index, segments.get(i));
}
}
int
M = index +
1
;
long
totalWays = power(
2
, M -
1
, (
long
)1e9 +
7
);
return
totalWays;
}
public
static
void
main(String[] args)
{
int
[] A = {
1
,
2
,
1
,
3
};
System.out.println(countOfPartitions(A));
}
}