import
java.util.ArrayList;
import
java.util.List;
class
Main {
static
final
int
N =
1000005
;
static
int
[] fr =
new
int
[N];
static
class
Tree {
List<Long> bit;
Tree()
{
bit =
new
ArrayList<>(N);
for
(
int
i =
0
; i < N; i++) {
bit.add(0L);
}
}
void
add(
int
node,
int
v)
{
for
(; node < N; node += (node & (-node))) {
bit.set(node,
bit.get(node)
+ v);
}
}
long
get(
int
node)
{
long
x =
0
;
for
(; node >
0
; node -= (node & (-node))) {
x += bit.get(
node);
}
return
x;
}
}
static
Tree obj1 =
new
Tree();
static
Tree obj2
=
new
Tree();
static
List<Integer>
maximumToys(
int
N, List<Integer> A,
int
Q,
List<List<Integer> > Queries)
{
List<Integer> res =
new
ArrayList<>();
for
(
int
i : A) {
fr[i]++;
}
for
(
int
i =
0
; i < A.size(); i++) {
obj1.add(A.get(i),
A.get(i));
obj2.add(
A.get(i),
1
);
}
for
(List<Integer> i : Queries) {
long
C = i.get(
0
);
for
(
int
j =
2
; j < i.size(); j++) {
obj1.add(A.get(i.get(j) -
1
),
-A.get(i.get(j)
-
1
));
obj2.add(A.get(i.get(j) -
1
),
-
1
);
}
long
lw =
1
,
hg
=
1000000
;
long
pos =
1000000
;
while
(lw <= hg) {
int
mid = (
int
)((lw + hg) /
2
);
if
(obj1.get(mid)
>= C) {
pos = mid;
hg = mid -
1
;
}
else
{
lw = mid +
1
;
}
}
long
ans = obj2.get(
(
int
)(pos -
1
));
long
mx = Math.min(
(C - obj1.get((
int
)(pos -
1
))) / pos,
(
long
)fr[(
int
)pos]);
ans += mx;
res.add((
int
)ans);
for
(
int
j =
2
; j < i.size(); j++) {
obj1.add(
A.get(i.get(j) -
1
),
A.get(i.get(j) -
1
));
obj2.add(A.get(i.get(j) -
1
),
1
);
}
}
for
(
int
i =
0
; i < A.size(); i++) {
obj1.add(
A.get(i),
-A.get(i));
obj2.add(A.get(i), -
1
);
fr[A.get(i)]--;
}
return
res;
}
public
static
void
main(String[] args)
{
List<Integer> A = List.of(
8
,
6
,
9
,
2
,
5
);
int
Q =
2
, N =
5
;
List<List<Integer> > Queries
= List.of(List.of(
12
,
2
,
3
,
4
), List.of(
30
,
0
));
List<Integer> result
= maximumToys(N, A, Q, Queries);
for
(
int
val : result) {
System.out.print(val +
" "
);
}
System.out.println();
}
}