class KthLargest {
private int[] minHeap;
private final int k;
private int last;
public KthLargest(int k, int[] nums) {
this.k = k;
this.minHeap = new int[k];
this.last = -1;
for (int i=0;i<k&&i<nums.length;i++){
minHeap[i]=nums[i];
last = i;
}
if (last==k-1){
for (int j=(k-1)/2;j>=0;j--){
sink(j);
}
for (int j=last+1;j<nums.length;j++){
add(nums[j]);
}
}
}
private void sink(int i){
while(2*i+1<k){
int j = 2*i+1;
if (j<k-1&&minHeap[j]>minHeap[j+1]){
j++;
}
if (minHeap[i]>minHeap[j]){
int tem = minHeap[i];
minHeap[i]=minHeap[j];
minHeap[j]=tem;
i=j;
}else{
break;
}
}
}
public int add(int val) {
if (last==k-2){
minHeap[k-1]=val;
last++;
for (int j=(k-1)/2;j>=0;j--){
sink(j);
}
}else{
if (val>minHeap[0]){
minHeap[0]=val;
sink(0);
}
}
return minHeap[0];
}
}