Pagini recente » Cod sursa (job #549882) | Cod sursa (job #3205317) | Cod sursa (job #145397) | Cod sursa (job #587888) | Cod sursa (job #2747041)
/*Acesta este heapul scris de mana
Heapul este deja implementt in c++
sub numele de priority queue
*/
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int N = 200000 + 7;
int n;
int ind[N];
int pos[N];
int t[N];
void schimba(int a, int b);
void repara(int a);
void coboara(int a) ;
void urca(int a);
int main() {
int q, id = 0;
fin >> q;
while (q--) {
int type;
fin >> type;
if (type == 1) {
int x;
fin >> x;
n++;
id++;
t[n] = x;
ind[n] = id;
pos[id] = n;
urca(n);
}
if (type == 2) {
int x;
fin >> x;
int b = pos[x];
schimba(n, b);
n--;
repara(b);
}
if (type == 3) {
fout << t[1]<<"\n";
}
}
}
void schimba(int a, int b) {
swap(t[a], t[b]);
swap(ind[a], ind[b]);
pos[ind[a]] = a;
pos[ind[b]] = b;
}
void urca(int a) {
if (a == 1) {
return;
}
if (t[a / 2] > t[a]) {
schimba(a, a / 2);
urca(a / 2);
}
}
void coboara(int a) {
int b = 0;
if (2 * a <= n) {
b = 2 * a;
if (2 * a + 1 <= n && t[2 * a + 1] < t[2 * a]) {
b = 2 * a + 1;
}
}
if (b > 0 && t[b] < t[a]) {
schimba(a, b);
coboara(b);
}
}
void repara(int a) {
if (a > 1 && t[a / 2] > t[a]) {
urca(a);
} else {
coboara(a);
}
}