2
class Node implements Comparable<Node> {6
Node(int val, int time) {12
public int compareTo(Node other) {13
return (this.val != other.val ? this.val - other.val : this.time - other.time);17
private TreeSet<Node> set = new TreeSet<>(); // natural order18
private Deque<Node> queue = new LinkedList<>();27
public MKAverage(int m, int k) {32
public void addElement(int num) {33
Node node = new Node(num, time++);38
if (time == m) init();43
for (Node node : set) {46
else if (i == k - 1) kLeft = node;47
else if (i < m - k) sum += node.val;48
else if (i == m - k) {58
private void addNode(Node node) {59
queue.offerLast(node);62
if (queue.size() <= m) return;64
if (node.compareTo(kLeft) < 0) {66
kLeft = set.lower(kLeft);67
} else if (node.compareTo(kRight) > 0) {69
kRight = set.higher(kRight);75
private void removeNode() {76
if (queue.size() <= m) return;78
Node node = queue.pollFirst();80
if (node.compareTo(kLeft) <= 0) {81
kLeft = set.higher(kLeft);83
} else if (node.compareTo(kRight) >= 0) {84
kRight = set.lower(kRight);93
public int calculateMKAverage() {94
return (queue.size() < m ? -1 : sum / (m - 2 * k));