Cod sursa(job #2099648)

Utilizator DimaTCDima Trubca DimaTC Data 4 ianuarie 2018 16:18:17
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>

using namespace std;

int H[200100],N,L,n, poz[200100],t,x, A[200100];

void heapifyup(int i) {
	if (i==1) return;
	if (A[H[i]]<A[H[i/2]]) {
		swap(H[i], H[i/2]);
		
		poz[H[i]]=i;
		poz[H[i/2]]=i/2;
		
		
		heapifyup(i/2);
	} else return;
}

void add(int val) {
	N++; L++;
	A[N]=val;
	H[L]=N;
	poz[N]=L;
	heapifyup(L);
}

void heapifydown(int i) {
	int minl=i;
	if (2*i<=L && A[H[i]]>A[H[2*i]]) minl=2*i;
	if (2*i+1<=L && A[H[minl]]>A[H[2*i+1]]) minl=2*i+1;
	if (minl!=i) {
		swap(H[minl],H[i]);
		poz[H[minl]]=minl;
		poz[H[i]]=i;
		heapifydown(minl);
	}
}

void del(int x) {
	swap(H[poz[x]], H[L]); 
	poz[H[poz[x]]]=poz[x];
	L--;

	
	int i=poz[x];
	if (A[H[i/2]]>A[H[i]]) {
		heapifyup(poz[x]);
	} else heapifydown(poz[x]);

}

int main() {
	ifstream cin("heapuri.in");
	ofstream cout("heapuri.out");
	cin>>t;
	
	while (t--) {
		cin>>x;
		switch (x) {
			case 1: { 
				cin>>x;
				add(x);
				
				break;
			}
			case 2: {
				cin>>x;
				del(x);
				break;
			}
			case 3: {
				cout<<A[H[1]]<<'\n';
				break;
			}
		}
	}
	
	
	return 0;
}