Pagini recente » Cod sursa (job #250646) | Cod sursa (job #2311719) | Cod sursa (job #1078034) | Cod sursa (job #1547318) | Cod sursa (job #2405107)
//Cautarea maximului/minimului in O(1)
//Crearea unei structuri de heap dintr-un vector oarecare in O(N)
//Eliminarea unui element in O(log N)
//Inserarea unui element in O(log N)
//Sortarea elementelor din heap in O(N log N)
//MIN-HEAP
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int MAX_HEAP_SIZE = 10000;
typedef struct {
int H[MAX_HEAP_SIZE];
int N = 0;
inline int father(int nod) { //Returneaza tatal
return nod >> 1;
}
inline int son_left(int nod) { //Returneaza fiul stang
return nod << 1;
}
inline int son_right(int nod) { //Returneaza fiul drept
return (nod << 1) + 1;
}
void sift_down(int K) { //Muta nodul K in jos
int son;
do {
son = 0;
if (son_left(K) <= N) { //Alegem cel mai mic fiu
son = son_left(K);
if(son_right(K) <= N && H[son_right(K)] < H[son])
son = son_right(K);
}
if(H[son] >= H[K])
son = 0;
if(son) { //Schimbam nodurile
swap(H[K], H[son]);
K = son;
}
} while(son);
}
inline void sift_up(int K) { //Muta nodul in sus
int key = H[K];
while(K > 0 && key < H[father(K)]) {
H[K] = H[father(K)];
K = father(K);
}
H[K] = key;
}
inline void insert(int key) { //Adauga un nod in heap
H[++N] = key;
sift_up(N);
}
inline void cut(int K) { //Taie nodul K din heap
H[K] = H[N];
N--;
if(K > 0 && H[K] < H[father(K)])
sift_up(K);
else
sift_down(K);
}
void heapify() //Creeaza un heap dintr-un vector oarecare
{
for(int i=N/2;i>0;i--)
sift_down(i);
}
void afis() { //Afiseaza heap-ul
for(int i = 1; i <= N; i++)
cout << H[i] << " ";
cout << endl;
}
int min() { //Returneaza minimul
return H[1];
}
inline int search(int Key) {
for(int i = 1; i <= N; i++)
if(H[i] == Key)
return i;
}
} Heap;
int main() {
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
Heap X;
int A[200001];
int j = 0;
int N, tip, x;
scanf("%d", &N);
for(int i = 1; i <= N; i++) {
scanf("%d", &tip);
if(tip == 1) {
scanf("%d", &x);
X.insert(x);
++j;
A[j] = x;
} else if(tip == 2) {
scanf("%d", &x);
X.cut(X.search(A[x]));
} else {
printf("%d\n",X.H[1]);
}
}
return 0;
}