import
java.util.*;
class
Pair<F, S> {
public
F first;
public
S second;
public
Pair(F first, S second)
{
this
.first = first;
this
.second = second;
}
public
S getValue() {
return
second; }
public
F getKey() {
return
first; }
}
class
GFG {
static
void
findMaximumSumValue(List<Pair<Integer, Integer> > arr,
int
n)
{
Map<Integer, List<Integer> > mp =
new
HashMap<>();
for
(
int
i =
0
; i < n; i++) {
if
(!mp.containsKey(arr.get(i).getValue()
-
1
)) {
mp.put(arr.get(i).getValue() -
1
,
new
ArrayList<>());
}
mp.get(arr.get(i).getValue() -
1
)
.add(arr.get(i).getKey());
}
List<List<Integer> > v =
new
ArrayList<>();
for
(Map.Entry<Integer, List<Integer> > i :
mp.entrySet()) {
v.add(i.getValue());
Collections.sort(v.get(v.size() -
1
));
}
List<Integer> ans
=
new
ArrayList<>(Collections.nCopies(n,
0
));
List<List<Integer> > it =
new
ArrayList<>();
for
(List<Integer> i : v) {
List<Integer> c =
new
ArrayList<>();
for
(
int
j =
0
; j < i.size(); j++) {
if
(j ==
0
) {
c.add(i.get(j));
}
else
{
c.add(c.get(c.size() -
1
) + i.get(j));
}
}
it.add(c);
}
for
(List<Integer> i : it) {
for
(
int
j =
1
; j <= i.size(); j++) {
int
left = i.size() % j;
int
del =
0
;
if
(left >
0
) {
del = i.get(left -
1
);
}
ans.set(j -
1
,
ans.get(j -
1
)
+ (i.get(i.size() -
1
) - del));
}
}
System.out.println(ans);
}
public
static
void
main(String[] args)
{
List<Pair<Integer, Integer> > arr
=
new
ArrayList<>();
arr.add(
new
Pair<>(
5
,
3
));
arr.add(
new
Pair<>(
9
,
3
));
arr.add(
new
Pair<>(
6
,
3
));
arr.add(
new
Pair<>(
7
,
3
));
arr.add(
new
Pair<>(
9
,
3
));
arr.add(
new
Pair<>(
7
,
3
));
int
N = arr.size();
findMaximumSumValue(arr, N);
}
}