Pagini recente » Cod sursa (job #2160815) | Cod sursa (job #1476246) | Cod sursa (job #402654) | Cod sursa (job #820798) | Cod sursa (job #259888)
Cod sursa(job #259888)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define le(K) K << 1
#define ri(K) (K << 1) + 1
#define fa(K) K >> 1
#define MINP 1
#define NEWP ++HSZ
#define MAX_SZ 200001
int H[MAX_SZ],HSZ,pos[MAX_SZ],S[MAX_SZ];
void hswap(int x,int y) {
int aux = pos[H[x]]; pos[H[x]] = pos[H[y]]; pos[H[y]] = aux;
aux = H[x]; H[x] = H[y]; H[y] = aux;
}
int dip(int K) {
int p;
while(1) {
p = K;
if(le(K) <= HSZ && S[H[le(K)]] < S[H[p]])
p = le(K);
if(ri(K) <= HSZ && S[H[ri(K)]] < S[H[p]])
p = ri(K);
if(p != K) hswap(K,p), K = p;
else break;
}
return K;
}
int lift(int K) {
while(fa(K) && H[K] < H[fa(K)])
hswap(K,fa(K)), K = fa(K);
return K;
}
inline int get(int K) {
return H[K];
}
int del(int K) { //returneaza valoarea de pe poz K
int sav = H[K];
hswap(K,HSZ--);
dip(K);
return sav;
}
int set(int K,int v) { //returneaza pozitia finala pe care s-a inserat
H[K] = v;
pos[v] = K;
if(le(K) <= HSZ && S[H[K]] > S[H[le(K)]] || ri(K) <= HSZ && S[H[K]] > S[H[ri(K)]])
return dip(K);
else if(fa(K) && H[K] < H[fa(K)]) return lift(K);
return K;
}
int main() {
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int N;
scanf("%d",&N);
int op,x,i = 0;
while(N--) {
scanf("%d",&op);
switch(op) {
case 1: scanf("%d",&S[++i]);
set(NEWP,i);
break;
case 2: scanf("%d",&x);
del(pos[x]);
break;
case 3: printf("%d\n",S[get(MINP)]);
}
}
}