Pagini recente » Cod sursa (job #2045322) | Cod sursa (job #322737) | Cod sursa (job #1395861) | Cod sursa (job #2876725) | Cod sursa (job #2494462)
#include <bits/stdc++.h>
#define MAX 131072
using namespace std;
const int NMAX = 200010;
FILE *IN;
int N, M;
int poz[NMAX], heap[NMAX], val[NMAX];
int pos, sign;
char f[MAX];
inline void Read(int &nr){
sign = 0;
nr = 0;
while(f[pos] < '0' || f[pos] > '9'){
if(f[pos] == '-') sign = 1;
pos++;
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
while(f[pos] >= '0' && f[pos] <= '9'){
nr = 10 * nr + f[pos++] - '0';
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
if(sign) nr =- nr;
}
void Swap(int x, int y){
swap(heap[x], heap[y]);
poz[heap[x]] = x;
poz[heap[y]] = y;
}
void upHeap(int node){
if(val[heap[node]] < val[heap[node / 2]] && node > 1){
Swap(node, node / 2);
upHeap(node / 2);
}
}
void downHeap(int node){
int tempNode = 2 * node;
if(tempNode > M)
return;
if(tempNode < M && val[heap[tempNode + 1]] < val[heap[tempNode]]) tempNode++;
if(val[heap[tempNode]] < val[heap[node]]){
Swap(node, tempNode);
downHeap(tempNode);
}
}
int main(){
IN = fopen("heapuri.in", "r");
freopen("heapuri.out", "w", stdout);
Read(N);
int tip, x;
int cnt = 0;
for(int i = 1; i <= N; i++){
Read(tip);
if(tip == 1){
M++; cnt++;
Read(val[cnt]);
heap[M] = cnt;
poz[cnt] = M;
upHeap(M);
} else if(tip == 2){
Read(x);
x = poz[x];
Swap(x, M);
M--;
upHeap(x);
downHeap(x);
} else printf("%d\n", val[heap[1]]);
}
return 0;
}