class Kopica():
    """Dvojiška kopica, implementirana s tabelo."""

    def __init__(self, kapaciteta=100):
        """Nova prazna kopica z dano maksimalno velikostjo."""
        self.kopica = [None for i in range(kapaciteta)]
        self.velikost = 0 # trenutna velikost

    def __repr__(self):
        return str(self.kopica[:self.velikost])

    # Ime metode se začne s podčrtajem, ker ni mišljeno,
    # da bi jo klicali zunaj razreda. Python nima privatnih metod.
    def _vozlisce(self, k):
        """K-to vozlišče kopice."""
        return self.kopica[k]

    def _oce(self, k):
        """Oče vozlišča."""
        return self._vozlisce((k-1)//2)

    def _levi(self, k):
        return self._vozlisce(2*k+1)

    def _desni(self, k):
        return self._vozlisce(2*k+2)

    def _zamenjaj(self, i, j):
        """Zamenjaj dani vozlišči."""
        (self.kopica[i], self.kopica[j]) = (self.kopica[j], self.kopica[i])

    def dodaj(self, x):
        """Dodaj novo vrednost v kopico."""
        n = self.velikost
        while n > 0 and self._oce(n) > x:
            self.kopica[n] = self._oce(n)
            n = (n-1) // 2
        self.kopica[n] = x
        self.velikost += 1
        return self

    def _popravi(self, n):
        """Popravi kopico pri danem vozlišču."""
        l = 2 * n + 1
        d = 2 * n + 2
        m = n # indeks najmanjšega
        if l < self.velikost and self._vozlisce(l) < self._vozlisce(m):
            m = l
        if d < self.velikost and self._vozlisce(d) < self._vozlisce(m):
            m = d
        if m != n:
            self._zamenjaj(n, m)
            self._popravi(m)

    def najmanjsi(self):
        """Vzemi najmanjši element iz kopice in ga vrni."""
        x = self._vozlisce(0)
        self.kopica[0] = self._vozlisce(self.velikost - 1)
        self.velikost -= 1
        self._popravi(0)
        return x
