#include <bits/stdc++.h>
using
namespace
std;
set<
int
>* segment;
void
build(
int
i,
int
s,
int
e,
int
arr[])
{
if
(s == e) {
segment[i].insert(arr[s]);
return
;
}
build(2 * i, s, (s + e) / 2, arr);
build(1 + 2 * i, 1 + (s + e) / 2, e, arr);
segment[i].insert(segment[2 * i].begin(),
segment[2 * i].end());
segment[i].insert(segment[2 * i + 1].begin(),
segment[2 * i + 1].end());
}
set<
int
> query(
int
node,
int
l,
int
r,
int
a,
int
b)
{
set<
int
> left, right, result;
if
(b < l || a > r)
return
result;
if
(a <= l && r <= b)
return
segment[node];
left = query(2 * node, l, (l + r) / 2, a, b);
result.insert(left.begin(), left.end());
right = query(1 + 2 * node, 1 + (l + r) / 2, r, a, b);
result.insert(right.begin(), right.end());
return
result;
}
void
init(
int
n)
{
int
h = (
int
)
ceil
(log2(n));
h = (2 * (
pow
(2, h))) - 1;
segment =
new
set<
int
>[h];
}
void
getDistinct(
int
l,
int
r,
int
n)
{
set<
int
> ans = query(1, 0, n - 1, l, r);
cout << ans.size() << endl;
}
int
main()
{
int
arr[] = { 1, 1, 2, 1, 3 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
init(n);
build(1, 0, n - 1, arr);
getDistinct(0, 4, n);
return
0;
}