Cod sursa(job #2580667)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 13 martie 2020 20:59:13
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
int n,heap[1003],poz,stiv[100005],m;
int st (int nr) {
	return (nr<<1);
}
int dr (int nr) {
	return ((nr<<1)^1);
}
int tata (int nr) {
	return (nr>>1);
}
void reconstituie_heap (int i) {
	int maxim=i;
	if(st(i)<=n && heap[st(i)]<heap[maxim])
		maxim=st(i);
	if(dr(i)<=n && heap[dr(i)]<heap[maxim])
		maxim=dr(i);
	if(maxim!=i) {
		swap(heap[i],heap[maxim]);
		reconstituie_heap(maxim);
	}
}
int insert_heap (int nr) {
	heap[++n]=nr;poz=n;
	while(poz>1 && heap[tata(poz)]>heap[n])
		poz=tata(poz);
	heap[poz]=nr;
	return poz;
}
int minim () {
	return heap[1];
}
void delete_heap (int nod) {
	swap(heap[nod],heap[n]);--n;
	reconstituie_heap(nod);
}
int main () {
	int q, nr;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d", &m);++m;
	while(--m) {
		/*printf("%d : ", m);
		for(int i=1;i<=n;++i)
			printf("%d ", heap[i]);
		printf("\n");*/
		scanf("%d", &q);
		if(q==1) {
			scanf("%d", &nr);
			stiv[++stiv[0]]=insert_heap(nr);
		}
		else if (q==2) {
			scanf("%d", &nr);
			delete_heap(stiv[nr]);
		} 
		else
			printf("%d\n", minim());
	}
	return 0;
}