Cod sursa(job #2662957)

Utilizator vali_27Bojici Valentin vali_27 Data 24 octombrie 2020 22:27:29
Problema Heapuri Scor 40
Compilator py Status done
Runda Arhiva educationala Marime 2.11 kb
class MinHeap:
    def __init__(self):
        self.val = []
        self.heap = []
        self.pos = []

    def __upheap__(self, node):
        while node > 0 and self.val[self.heap[node]] < self.val[self.heap[(node-1)//2]]:
            self.heap[node], self.heap[(node-1)//2] = self.heap[(node-1)//2], self.heap[node]

            self.pos[self.heap[node]] = node
            self.pos[self.heap[(node-1)//2]] = (node-1)//2

            node = (node-1)//2

    def __getIdxMin__(self, node):
        if node*2+2 < len(self.heap):
            return node*2+1 if self.val[self.heap[node*2+1]] <= self.val[self.heap[node*2+2]] else node*2+2
        return node*2+1

    def __downheap__(self, node):
        while node < len(self.heap)//2:
            idxMin = self.__getIdxMin__(node)
            if self.val[self.heap[node]] > self.val[self.heap[idxMin]]:
                self.heap[node], self.heap[idxMin] = self.heap[idxMin], self.heap[node]

                self.pos[self.heap[node]] = node
                self.pos[self.heap[idxMin]] = idxMin

                node = idxMin
            else:
                return

    def insert(self,val):
        self.val.append(val)
        self.heap.append(len(self.val)-1)
        self.pos.append(len(self.heap)-1)

        self.__upheap__(len(self.heap)-1)

    def deleteAt(self,index):
        self.val[index] = -1
        self.__upheap__(self.pos[index])
        self.pos[self.heap[0]] = -1
        self.heap[0] = self.heap[-1]
        self.pos[self.heap[0]] = 0

        self.heap.pop()
        self.__downheap__(0)

    def getMin(self):
        return self.val[self.heap[0]]

    def __repr__(self):
        return str([self.val[x] for x in self.heap])


h = MinHeap()

with open('heapuri.in', 'r') as f:
    with open('heapuri.out','w') as g:
        for _ in range(int(f.readline())):
            info = f.readline().split()
            if info[0] == '1':
                h.insert(int(info[1]))
            elif info[0] == '2':
                h.deleteAt(int(info[1])-1)
            else:
                g.write(str(h.getMin()) + '\n')