Cod sursa(job #2580831)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 14 martie 2020 11:25:29
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
int n_heap,v[200003],heap[200003],poz[200003],p,m;
void remake_heap (int i) {
	int maxim=i;
	if((i<<1)<=n_heap && v[heap[(i<<1)]]<v[heap[maxim]])
		maxim=(i<<1);
	if(((i<<1)^1)<=n_heap && v[heap[(i<<1)^1]]<v[heap[maxim]])
		maxim=((i<<1)^1);
	if(maxim!=i) {
		swap(poz[heap[i]],poz[heap[maxim]]);swap(heap[i],heap[maxim]);
		remake_heap(maxim);
	}
}	
void insert_heap (int nr) {
	v[++v[0]]=nr;poz[v[0]]=n_heap+1;heap[++n_heap]=v[0];p=n_heap;
	while(p>1 && v[heap[(p>>1)]]>nr)
		poz[heap[(p>>1)]]=p,heap[p]=heap[(p>>1)],p>>=1;
	poz[v[0]]=p;heap[p]=v[0];
}
void delete_heap (int nr) {
	poz[heap[n_heap]]=poz[nr];heap[poz[nr]]=heap[n_heap];poz[nr]=n_heap;--n_heap;
	remake_heap(poz[heap[n_heap+1]]);
}
int main () {
	int q,nr;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d", &m);++m;
	while(--m) {
		scanf("%d", &q);
		/*for(int i=1;i<=v[0];++i)
			printf("%d ", v[i]);
		printf("\n");
		for(int i=1;i<=n_heap;++i)
			printf("%d ", heap[i]);
		printf("\n");
		for(int i=1;i<=v[0];++i)
			printf("%d ", poz[i]);
		printf("\n\n\n");*/
		if(q==1)
			scanf("%d", &nr),insert_heap(nr);
		else if(q==2)
			scanf("%d", &nr),delete_heap(nr);
		else
			printf("%d\n", v[heap[1]]);
	}
	return 0;
}