code: @SuppressWarnings("unchecked")
      private void decreaseKey(Node<K, V> n, K newKey) {
          int c;
          if (comparator == null) {
              c = ((Comparable<? super K>) newKey).compareTo(n.key);
          } else {
              c = comparator.compare(newKey, n.key);
          }
  
          if (c > 0) {
              throw new IllegalArgumentException("Keys can only be decreased!");
          }
          n.key = newKey;
  
          if (c == 0 || root == n) {
              // root or no change in key
              return;
          } else if (n.o_s == null && n.poolIndex == Node.NO_INDEX) {
              // no root, no parent and no pool index
              throw new IllegalArgumentException("Invalid handle!");
          } else if (n.o_s == null) {
              // no parent and not root, so inside pool
              Node<K, V> poolMin = decreasePool[decreasePoolMinPos];
              if (comparator == null) {
                  c = ((Comparable<? super K>) newKey).compareTo(poolMin.key);
              } else {
                  c = comparator.compare(newKey, poolMin.key);
              }
              if (c < 0) {
                  decreasePoolMinPos = n.poolIndex;
              }
              return;
          } else {
              // node has a parent
              Node<K, V> oldestChild = cutOldestChild(n);
              if (oldestChild != null) {
                  linkInPlace(oldestChild, n);
              } else {
                  cutFromParent(n);
              }
  
              // append node (minus oldest child) to decrease pool
              addPool(n, true);
  
              // if decrease pool has >= ceil(logn) trees, consolidate
              double sizeAsDouble = size;
              if (decreasePoolSize >= Math.getExponent(sizeAsDouble) + 1) {
                  consolidate();
              }
          }
      }
docs: /*
  Decrease the key of a node.