Cod sursa(job #2766204)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 31 iulie 2021 12:54:24
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int A[200001], Heap[200001], Pos[200001], heapsize=0, insrt=0;

void heapify(int i) {
    int smallest = i, l = 2*i, r=2*i+1;
    if(l<=heapsize && A[Heap[l]]<A[Heap[smallest]]) smallest = l;
    if(r<=heapsize && A[Heap[r]]<A[Heap[smallest]]) smallest = r;
    if(smallest!=i) {
        swap(Heap[smallest], Heap[i]);
        Pos[Heap[i]] = i;
        Pos[Heap[smallest]] = smallest;
        heapify(smallest);   
    }
}

void push(int x) {
	A[++insrt] = x;
	Heap[++heapsize] = insrt;
	int i = heapsize;
	while(i>1 && A[Heap[i]]<A[Heap[i/2]]) {
	    swap(Heap[i], Heap[i/2]);
	    Pos[Heap[i]] = i;
	    Pos[Heap[i/2]] = i/2;
	    i = i/2;
	}
}

void pop(int x) {
    int idx = Pos[x];
    swap(Heap[idx], Heap[heapsize]);
    Pos[Heap[idx]] = idx;
    Pos[Heap[heapsize]] = heapsize;
    heapsize--;
    heapify(idx);
}

int main() {
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
	int n;
	scanf("%d ", &n);
	while(n--) {
	 int nr;
	 scanf("%d ", &nr);
	 if(nr == 1) {
	    int x;
	    scanf("%d ", &x);
	    push(x);
	 }
	 if(nr == 2) {
	    int x;
	    scanf("%d ", &x);
	    pop(x);
	 }
	 if(nr == 3) {
	    printf("%d\n", A[Heap[1]]);    
	 }
	}
	return 0;
}