class Noeud:
    def __init__(self, key):
        self.key = key
        self.children = []
        self.degree = 0


class TasBinomial:
    def __init__(self):
        self.arbres = []

    def union(self, nouveau_tas):
        self.arbres.extend(nouveau_tas.arbres)
        self.arbres.sort(key=lambda x: x.degree)
        i = 0
        while i < len(self.arbres) - 1:
            if self.arbres[i].degree == self.arbres[i + 1].degree:
                if self.arbres[i].key > self.arbres[i + 1].key:
                    self.arbres[i], self.arbres[i +
                                                1] = self.arbres[i + 1], self.arbres[i]
                self.arbres[i].children.append(self.arbres[i + 1])
                del self.arbres[i + 1]
            else:
                i += 1

    def inserer(self, key):
        nouveau_tas = TasBinomial()
        nouveau_tas.arbres.append(Noeud(key))
        self.union(nouveau_tas)

    def get_min(self):
        if not self.arbres:
            return None
        min_node = self.arbres[0]
        for arbre in self.arbres:
            if arbre.key < min_node.key:
                min_node = arbre
        return min_node.key

    def extraire_min(self):
        if not self.arbres:
            return None
        min_node = self.arbres[0]
        min_idx = 0
        for i, arbre in enumerate(self.arbres):
            if arbre.key < min_node.key:
                min_node = arbre
                min_idx = i
        del self.arbres[min_idx]
        tas_enfant = TasBinomial()
        tas_enfant.arbres = min_node.children
        self.union(tas_enfant)
        return min_node.key


if __name__ == "__main__":

    # Exemple d'utilisation :
    tokens1 = [10, [12, 11, 1], 5, 22, 99, [20, 70, 60, 65, 23], 6, 4]
    tokens2 = [80, 19, 51, 30, 82, 65, 45, 55, 75, 88, 28, 27, 3, 6, 7, 2]

    tas = TasBinomial()
    tas.inserer(5)
    tas.inserer(3)
    tas.inserer(10)
    tas.inserer(2)
    tas.inserer(12)
    tas.inserer(20)

    print("Min:", tas.get_min())
    print("Extract Min:", tas.extraire_min())
    print("Min:", tas.get_min())