import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int[] input = new int[n+1];
for(int i = 1;i<=n;i++) {
input[i] = scan.nextInt();
}
scan.close();
Segment segment = new Segment(n,input);
int start = 1;
int end = n-m+1;
for(int i = 1;i<=m;i++) {
int t = 0;
t = segment.search(1, start, end);
start = segment.searchIndex(1, start, end) + 1;
end++;
System.out.print(t + " ");
}
}
private static class Segment{
Node[] tree;
private class Node{
int l,r;
int max;
int maxIndex;
}
public Segment(int n,int[] input) {
tree = new Node[4*n+1];
for(int i=1;i<=4*n;i++)
tree[i] = new Node();
build(1,1,n,input);
return ;
}
public void build(int n,int l,int r,int[] input) {
tree[n].l = l;
tree[n].r = r;
if(l == r) {
tree[n].max = input[l];
tree[n].maxIndex = l;
return ;
}
int mid = l + (r - l)/2;
build(2*n,l,mid,input);
build(2*n+1,mid+1,r,input);
tree[n].max = Math.max(tree[2*n].max, tree[2*n+1].max);
if(tree[2*n].max >= tree[2*n+1].max) tree[n].maxIndex = tree[2*n].maxIndex;
else tree[n].maxIndex = tree[2*n+1].maxIndex;
return ;
}
public int search(int n,int l,int r) {
if(tree[n].l >= l && tree[n].r <= r) {
return tree[n].max;
}
if(tree[n].l > r || tree[n].r < l) return 0;
int t = 0;
if(tree[2*n].r >= l) t = search(2*n,l,r);
if(tree[2*n+1].l <= r) t = Math.max(t,search(2*n+1,l,r));
return t;
}
public int searchIndex(int n,int l,int r) {
if(tree[n].l >= l && tree[n].r <= r) {
return tree[n].maxIndex;
}
if(tree[n].l > r || tree[n].r < l) return 0;
int t = 0;
int t1 = 0;
if(tree[2*n].r >= l) t = search(2*n,l,r);
if(tree[2*n+1].l <= r) t1 = search(2*n+1,l,r);
if(t >= t1) return searchIndex(2*n,l,r);
else return searchIndex(2*n+1,l,r);
}
}
}
07-04
297
10-15
267