Pagini recente » Cod sursa (job #2115152) | Cod sursa (job #687432) | Cod sursa (job #1335191) | Cod sursa (job #1739049) | Cod sursa (job #504289)
Cod sursa(job #504289)
#include<cstdio>
#include<algorithm>
using namespace std;
const int Nmax = 200005;
int H[Nmax], A[Nmax], poz[Nmax], N, Nr;
void Heap_Up(int k) {
while(k>1 && H[k]<H[k/2]) {
swap(H[k],H[k/2]);
swap(A[k],A[k/2]);
poz[A[k]]=k;
poz[A[k/2]]=k/2;
k/=2;
}
}
void insert(int val) {
N++; Nr++;
H[N]=val;
A[N]=Nr;
poz[Nr]=N;
Heap_Up(N);
}
void Heap_Down(int k) {
int son=k;
if(2*k<=N && H[2*k]<H[son])
son=2*k;
if(2*k+1<=N && H[2*k+1]<H[son])
son=2*k+1;
if(son!=k) {
swap(H[k],H[son]);
swap(A[k],A[son]);
poz[A[k]]=k;
poz[A[son]]=son;
Heap_Down(son);
}
}
void erase(int ord) {
int k;
k=poz[ord];
H[k]=H[N];
N--;
if(k>1 && H[k]<H[k/2])
Heap_Up(k);
else
Heap_Down(k);
}
int main() {
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int M, val, tip, ord;
for(scanf("%d",&M); M; --M) {
scanf("%d",&tip);
switch(tip) {
case 1:
scanf("%d",&val);
insert(val);
break;
case 2:
scanf("%d",&ord);
erase(ord);
break;
case 3:
printf("%d\n",H[1]);
break;
}
}
return 0;
}