#include <stdio.h>
#include <stdlib.h>
int
cmp(
const
void
* a,
const
void
* b)
{
return
(*(
int
*)a - *(
int
*)b);
}
int
lower_bound(
int
arr[],
int
N,
int
X)
{
int
low = 0;
int
high = N;
while
(low < high) {
int
mid = low + (high - low) / 2;
if
(X <= arr[mid]) {
high = mid;
}
else
{
low = mid + 1;
}
}
return
low;
}
int
upper_bound(
int
arr[],
int
N,
int
X)
{
int
low = 0;
int
high = N;
while
(low < high) {
int
mid = low + (high - low) / 2;
if
(X >= arr[mid]) {
low = mid + 1;
}
else
{
high = mid;
}
}
return
low;
}
int
findFreq(
int
arr[],
int
N,
int
X)
{
int
UB = upper_bound(arr, N, X);
int
LB = lower_bound(arr, N, X);
return
(UB - LB);
}
void
UtilFindFreqArr(
int
arr[],
int
N)
{
qsort
(arr, N,
sizeof
(
int
), cmp);
printf
(
"{ "
);
for
(
int
i = 0; i < N;) {
int
fr = findFreq(arr, N,
arr[i]);
printf
(
"%d : %d"
,
arr[i], fr);
i++;
while
(i < N && arr[i] == arr[i - 1]) {
i++;
}
if
(i <= N - 1) {
printf
(
", "
);
}
}
printf
(
" }"
);
}
int
main()
{
int
arr[] = { 1, 100000000, 3,
100000000, 3 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
UtilFindFreqArr(arr, N);
}