/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static class MyHeap< T extends Comparable< T>> {
final ArrayList< T> data;
final int n;
int used;
public MyHeap( int n) {
this .n = n;
this .data = new ArrayList<> ( n) ;
}
public void add( T elem) {
if ( used == n)
if ( data.size ( ) < n)
data.add ( elem) ;
else
data.set ( used, elem) ;
used ++;
bubbleUp( used - 1 ) ;
}
protected void bubbleUp( int pos) {
while ( pos > 0 ) {
int parent = ( pos - 1 ) / 2 ;
if ( data.get ( parent) .compareTo ( data.get ( pos) ) < 0 )
return ;
T temp = data.get ( parent) ;
data.set ( parent, data.get ( pos) ) ;
data.set ( pos, temp) ;
}
}
protected void bubbleDown( int pos) {
while ( 2 * pos + 1 < used) {
int path = 2 * pos + 1 ;
int child2 = 2 * pos + 2 ;
if ( child2 < used && data.get ( child2) .compareTo ( data.get ( path) ) < 0 )
path = child2;
if ( data.get ( pos) .compareTo ( data.get ( path) ) > 0 ) {
T temp = data.get ( pos) ;
data.set ( pos, data.get ( path) ) ;
data.set ( path, temp) ;
pos = path;
}
}
}
public T pop( ) {
if ( used == 0 ) return null ;
T res = data.get ( 0 ) ;
data.set ( 0 , data.get ( used) ) ;
used --;
bubbleDown( 0 ) ;
return res;
}
public int size( ) {
return used;
}
}
{
MyHeap< Integer> heap = new MyHeap<> ( 10 ) ;
heap.add ( 15 ) ;
heap.add ( 324 ) ;
heap.add ( - 2 ) ;
heap.add ( 22 ) ;
heap.add ( 65 ) ;
heap.add ( 11 ) ;
heap.add ( 19 ) ;
while ( heap.size ( ) > 0 ) {
int a = heap.pop ( ) ;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXN0YXRpYyBjbGFzcyBNeUhlYXA8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IHsKCQlmaW5hbCBBcnJheUxpc3Q8VD4gZGF0YTsKCQlmaW5hbCBpbnQgbjsKCQlpbnQgdXNlZDsKCQkKCQlwdWJsaWMgTXlIZWFwKGludCBuKSB7CgkJCXRoaXMubiA9IG47CgkJCXRoaXMuZGF0YSA9IG5ldyBBcnJheUxpc3Q8PihuKTsKCQl9CgkJCgkJcHVibGljIHZvaWQgYWRkKFQgZWxlbSkgewoJCQlpZiAodXNlZCA9PSBuKQoJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImhlYXAgZnVsbCIpOwoJCQlpZiAoZGF0YS5zaXplKCkgPCBuKQoJCQkJZGF0YS5hZGQoZWxlbSk7CgkJCWVsc2UKCQkJCWRhdGEuc2V0KHVzZWQsIGVsZW0pOwoJCQl1c2VkICsrOwoJCQlidWJibGVVcCh1c2VkIC0gMSk7CgkJfQoJCQoJCXByb3RlY3RlZCB2b2lkIGJ1YmJsZVVwKGludCBwb3MpIHsKCQkJd2hpbGUgKHBvcyA+IDApIHsKCQkJCWludCBwYXJlbnQgPSAocG9zIC0gMSkgLyAyOwoJCQkJaWYgKGRhdGEuZ2V0KHBhcmVudCkuY29tcGFyZVRvKGRhdGEuZ2V0KHBvcykpIDwgMCkKCQkJCQlyZXR1cm47CgkJCQlUIHRlbXAgPSBkYXRhLmdldChwYXJlbnQpOwoJCQkJZGF0YS5zZXQocGFyZW50LCBkYXRhLmdldChwb3MpKTsKCQkJCWRhdGEuc2V0KHBvcywgdGVtcCk7CgkJCX0KCQl9CgkJCgkJcHJvdGVjdGVkIHZvaWQgYnViYmxlRG93bihpbnQgcG9zKSB7CgkJCXdoaWxlICgyICogcG9zICsgMSA8IHVzZWQpIHsKCQkJCWludCBwYXRoID0gMiAqIHBvcyArIDE7CgkJCQlpbnQgY2hpbGQyID0gMiAqIHBvcyArIDI7CgkJCQlpZiAoY2hpbGQyIDwgdXNlZCAmJiBkYXRhLmdldChjaGlsZDIpLmNvbXBhcmVUbyhkYXRhLmdldChwYXRoKSkgPCAwKQoJCQkJCXBhdGggPSBjaGlsZDI7CgkJCQlpZiAoZGF0YS5nZXQocG9zKS5jb21wYXJlVG8oZGF0YS5nZXQocGF0aCkpID4gMCkgewoJCQkJCVQgdGVtcCA9IGRhdGEuZ2V0KHBvcyk7CgkJCQkJZGF0YS5zZXQocG9zLCBkYXRhLmdldChwYXRoKSk7CgkJCQkJZGF0YS5zZXQocGF0aCwgdGVtcCk7CgkJCQkJcG9zID0gcGF0aDsKCQkJCX0KCQkJfQoJCX0KCQkKCQlwdWJsaWMgVCBwb3AoKSB7CgkJCWlmICh1c2VkID09IDApIHJldHVybiBudWxsOwoJCQlUIHJlcyA9IGRhdGEuZ2V0KDApOwoJCQlkYXRhLnNldCgwLCBkYXRhLmdldCh1c2VkKSk7CgkJCXVzZWQgLS07CgkJCWJ1YmJsZURvd24oMCk7CgkJCXJldHVybiByZXM7CgkJfQoJCQoJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKCQkJcmV0dXJuIHVzZWQ7CgkJfQoJCQoJfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlNeUhlYXA8SW50ZWdlcj4gaGVhcCA9IG5ldyBNeUhlYXA8PigxMCk7CgkJaGVhcC5hZGQoMTUpOwoJCWhlYXAuYWRkKDMyNCk7CgkJaGVhcC5hZGQoLTIpOwoJCWhlYXAuYWRkKDIyKTsKCQloZWFwLmFkZCg2NSk7CgkJaGVhcC5hZGQoMTEpOwoJCWhlYXAuYWRkKDE5KTsKCQkKCQl3aGlsZSAoaGVhcC5zaXplKCkgPiAwKSB7CgkJCWludCBhID0gaGVhcC5wb3AoKTsKCQkJU3lzdGVtLm91dC5wcmludGxuKGEpOwoJCX0KCX0KfQ==