import
java.util.*;
class
GFG {
public
static
void
SegAdd(
int
[] seg,
int
start,
int
end,
int
pos,
int
curr) {
if
(pos < start || pos > end) {
return
;
}
if
(start == end) {
seg[curr] =
1
;
return
;
}
int
mid = (start + end) /
2
;
SegAdd(seg, start, mid, pos,
2
* curr +
1
);
SegAdd(seg, mid +
1
, end, pos,
2
* curr +
2
);
seg[curr] = seg[
2
* curr +
1
] + seg[
2
* curr +
2
];
}
public
static
int
SegFind(
int
[] seg,
int
pos_start,
int
pos_end,
int
start,
int
end,
int
curr) {
if
(pos_end < start || pos_start > end) {
return
0
;
}
if
(pos_start <= start && pos_end >= end) {
return
seg[curr];
}
int
mid = (start + end) /
2
;
int
left = SegFind(seg, pos_start, pos_end, start, mid,
2
* curr +
1
);
int
right = SegFind(seg, pos_start, pos_end, mid +
1
, end,
2
* curr +
2
);
return
left + right;
}
public
static
String RemoveLeadingZeros(String s) {
int
i =
0
;
String ans =
""
;
while
(i < s.length()) {
if
(s.charAt(i) ==
'0'
) {
i +=
1
;
}
else
{
break
;
}
}
ans = s.substring(i);
return
ans;
}
public
static
String FindMinimumInteger(String s,
int
k) {
s = RemoveLeadingZeros(s);
int
n = s.length();
int
[] seg =
new
int
[
2
* (
int
) Math.pow(
2
, Math.ceil(Math.log(n) / Math.log(
2
))) -
1
];
Map<Integer, List<Integer>> m =
new
HashMap<Integer, List<Integer>>();
for
(
int
i =
0
; i <
10
; i++) {
m.put(i,
new
ArrayList<Integer>());
}
for
(
int
i =
0
; i < n; i++) {
m.get(Integer.parseInt(String.valueOf(s.charAt(i)))).add(i);
}
String res =
""
;
for
(
int
i =
0
; i < n; i++) {
for
(
int
digit =
0
; digit <
10
; digit++) {
if
(m.get(digit).size() !=
0
) {
int
original_pos = m.get(digit).get(
0
);
int
shift = SegFind(seg, original_pos, n -
1
,
0
, n -
1
,
0
);
int
new_pos = original_pos + shift - i;
if
(new_pos <= k) {
k -= new_pos;
SegAdd(seg,
0
, n -
1
, original_pos,
0
);
res += String.valueOf(digit);
m.get(digit).remove(
0
);
break
;
}
}
}
}
return
res;
}
public
static
void
main(String[] args) {
String s =
"9438957234785635408"
;
int
k =
23
;
System.out.println(FindMinimumInteger(s, k));
}
}