Pagini recente » Cod sursa (job #3198876) | Cod sursa (job #2668321) | Cod sursa (job #2376691) | Cod sursa (job #2959838) | Cod sursa (job #3252821)
#include <bits/stdc++.h>
#define MAX 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
/// poz[i] = pozitia in heap al elementului adaugat al i-lea in ordine cronologica
int i, cer, a, k, poz[MAX], s, n;
struct hp {
int val, ord;
} heap[MAX];
void myswap(int a, int b) {
swap(poz[heap[a].ord], poz[heap[b].ord]);
swap(heap[a], heap[b]);
}
void up(int p) {
while (heap[p].val<heap[p/2].val && p>1) {
myswap(p, p/2);
p/=2;
}
}
void down(int p) {
while (p*2<=s) {
int t=2*p;
if (p*2<s && heap[p*2].val>heap[p*2+1].val) t++;
if (heap[t].val<heap[p].val) {
myswap(p, t);
p=t;
}
else return ;
}
}
void adauga(int val, int ord) {
s++;
poz[ord]=s;
heap[s]={val, ord};
up(s);
}
void sterge(int ord) {
if (poz[ord]==s) {
s--;
return ;
}
int x=poz[ord];
myswap(x, s);
s--;
up(x);
down(x);
}
int main()
{
fin>>n;
for (i=1; i<=n; i++) {
fin>>cer;
if (cer==1) {
fin>>a;
k++;
adauga(a, k);
}
if (cer==2) {
fin>>a;
sterge(a);
}
if (cer==3) fout<<heap[1].val<<'\n';
}
return 0;
}