+/**
+ * @brief Extracts from the heap and returns the element at position i.
+ * \param H the heap we're working on
+ * \param i element position
+ * \return the element at position i if ok, NULL otherwise
+ *
+ * Extracts from the heap and returns the element at position i. The heap is automatically reordered.
+ */
+void *xbt_heap_remove(xbt_heap_t H, int i)
+{
+ XBT_DEBUG("Heap has %d elements: extracting element %d",xbt_heap_size(H),i);
+
+ if ((i < 0) || (i > H->count - 1))
+ return NULL;
+ /* put element i at head */
+ if (i > 0) {
+ KEY(H, i) = MIN_KEY_VALUE;
+ xbt_heap_increase_key(H, i);
+ }
+
+ return xbt_heap_pop(H);
+}
+/** @brief Remove an arbitrary element from the heap
+ * @param H the heap we're working on
+ * @param content the object you want to add to the heap
+ * @param key the key associated to this object
+ */
+void xbt_heap_rm_elm(xbt_heap_t H, void *content, double key) {
+ int i=0;
+ while (i < H->count && (KEY(H, i) != key || CONTENT(H, i) != content))
+ i++;
+ if (i == H->count)
+ return;
+ xbt_heap_remove(H,i);
+}
+
+/**
+ * @brief Updates an element of the heap with a new value.
+ * \param H the heap we're working on
+ * \param i element position
+ * \param key new value for the element
+ *
+ * Updates an element of the heap with a new value.
+ */
+void xbt_heap_update(xbt_heap_t H, int i, double key)
+{
+ XBT_DEBUG("Heap has %d elements: updating element %d : was %1.12f to %1.12f ",xbt_heap_size(H),i,KEY(H, i), key);
+
+ if ((i < 0) || (i > H->count - 1) || key == KEY(H, i))
+ return ;
+
+ if(key< KEY(H, i)){
+ KEY(H, i)=key;
+ xbt_heap_increase_key(H, i);
+ }else{
+ KEY(H, i)=key;
+ xbt_heap_max_heapify(H,i);
+ }
+}
+