import java.util.ArrayDeque;
import java.util.Queue;
/**
* Created by Vikrant on 4/1/14.
*/
public class Main {
ArrayDeque<Integer> queue;
Queue<Integer> save;
public static void main
(String[] args
) { Main sw = new Main();
int[] A = new int[]{1, 7, 2, 3, 1, 4, 5, 2, 3, 6};
int k = 3;
sw.printKMax(A, k);
k = 4;
sw.printKMax(A, k);
k = 1;
sw.printKMax(A, k);
k = A.length;
sw.printKMax(A, k);
}
public void printKMax(int[] A, int k) {
solve(A, k);
}
}
private void solve(int[] A, int k) {
save = new ArrayDeque<Integer>();
queue = new ArrayDeque<Integer>();
for (int i = 0; i < k; i++) {
removeSmallerFromLast(A, i);
queue.addLast(i);
}
for (int i = k; i < A.length; i++) {
save.add(A[queue.getFirst()]);
// remove elements out of window
while (!queue.isEmpty() && queue.getFirst() <= i - k)
queue.pollFirst();
removeSmallerFromLast(A, i);
queue.addLast(i);
}
save.add(A[queue.getFirst()]);
}
private void removeSmallerFromLast(int[] A, int i) {
while (!queue.isEmpty() && A[queue.peekLast()] < A[i])
queue.pollLast();
}
}
CgppbXBvcnQgamF2YS51dGlsLkFycmF5RGVxdWU7CmltcG9ydCBqYXZhLnV0aWwuUXVldWU7CgovKioKICogQ3JlYXRlZCBieSBWaWtyYW50IG9uIDQvMS8xNC4KICovCnB1YmxpYyBjbGFzcyBNYWluIHsKCUFycmF5RGVxdWU8SW50ZWdlcj4gcXVldWU7CglRdWV1ZTxJbnRlZ2VyPiBzYXZlOwoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlNYWluIHN3ID0gbmV3IE1haW4oKTsKCQlpbnRbXSBBID0gbmV3IGludFtdezEsIDcsIDIsIDMsIDEsIDQsIDUsIDIsIDMsIDZ9OwoJCWludCBrID0gMzsKCQlzdy5wcmludEtNYXgoQSwgayk7CgkJayA9IDQ7CgkJc3cucHJpbnRLTWF4KEEsIGspOwoJCWsgPSAxOwoJCXN3LnByaW50S01heChBLCBrKTsKCQlrID0gQS5sZW5ndGg7CgkJc3cucHJpbnRLTWF4KEEsIGspOwoJfQoKCXB1YmxpYyB2b2lkIHByaW50S01heChpbnRbXSBBLCBpbnQgaykgewoJCXNvbHZlKEEsIGspOwoJCWZvciAoSW50ZWdlciBlIDogc2F2ZSkgewoJCQlTeXN0ZW0ub3V0LnByaW50KGUgKyAiICIpOwoJCX0KCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKCX0KCglwcml2YXRlIHZvaWQgc29sdmUoaW50W10gQSwgaW50IGspIHsKCQlzYXZlID0gbmV3IEFycmF5RGVxdWU8SW50ZWdlcj4oKTsKCQlxdWV1ZSA9IG5ldyBBcnJheURlcXVlPEludGVnZXI+KCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpKyspIHsKCgkJCXJlbW92ZVNtYWxsZXJGcm9tTGFzdChBLCBpKTsKCQkJcXVldWUuYWRkTGFzdChpKTsKCQl9CgkJZm9yIChpbnQgaSA9IGs7IGkgPCBBLmxlbmd0aDsgaSsrKSB7CgkJCXNhdmUuYWRkKEFbcXVldWUuZ2V0Rmlyc3QoKV0pOwoKCQkJLy8gcmVtb3ZlIGVsZW1lbnRzIG91dCBvZiB3aW5kb3cKCQkJd2hpbGUgKCFxdWV1ZS5pc0VtcHR5KCkgJiYgcXVldWUuZ2V0Rmlyc3QoKSA8PSBpIC0gaykKCQkJCXF1ZXVlLnBvbGxGaXJzdCgpOwoKCQkJcmVtb3ZlU21hbGxlckZyb21MYXN0KEEsIGkpOwoKCQkJcXVldWUuYWRkTGFzdChpKTsKCgkJfQoJCXNhdmUuYWRkKEFbcXVldWUuZ2V0Rmlyc3QoKV0pOwoKCX0KCglwcml2YXRlIHZvaWQgcmVtb3ZlU21hbGxlckZyb21MYXN0KGludFtdIEEsIGludCBpKSB7CgkJd2hpbGUgKCFxdWV1ZS5pc0VtcHR5KCkgJiYgQVtxdWV1ZS5wZWVrTGFzdCgpXSA8IEFbaV0pCgkJCXF1ZXVlLnBvbGxMYXN0KCk7Cgl9Cgp9Cg==