Pagini recente » Cod sursa (job #535263) | Cod sursa (job #2551260) | Cod sursa (job #84641) | Cod sursa (job #2437640) | Cod sursa (job #3155802)
#include <fstream>
#include <vector>
#include <climits>
#define left(n) 2 * n
#define right(n) 2 * n + 1
#define N 200001
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");
std::vector<int> list; int k = 0;
int elem[N], posarb[N];
void insert(int value, std::vector<int>& list){
list[k++] = value;
posarb[value] = k - 1;
int x = k - 1;
while(x != 0 && elem[list[x]] < elem[list[x / 2]]){
std::swap(posarb[list[x]], posarb[list[x / 2]]);
std::swap(list[x], list[x / 2]);
x /= 2;
}
}
void heapify(int node, std::vector<int>& list){
int i = node, mn = elem[list[node]];
if(left(node) < k && mn > elem[list[left(node)]]){
mn = elem[ list[ left(node) ] ]; i = left(node);
}
if(right(node) < k && mn > elem[list[right(node)]]){
mn = elem[list[right(node)]]; i = right(node);
}
if(i != node){
std::swap(posarb[node], posarb[i]);
std::swap(list[node], list[i]);
heapify(i, list);
}
}
void heapifyutil(int node, std::vector<int> &list){
list[node] = list[k - 1];
//elem[list[0]] = elem[list[k - 1]];
k--;
heapify(node, list);
}
void del(int node, std::vector<int>& list){
elem[list[node]] = INT_MIN;
list[node] = 0;
while(node != 0 && elem[list[node]] < elem[list[node / 2]]){
std::swap(posarb[list[node]], posarb[list[node / 2]]);
std::swap(list[node], list[node / 2]);
node /= 2;
}
heapifyutil(0, list);
}
int main(){
int n;
fin >> n;
int op, x, cnt = 0;
list = std::vector<int> (4 * n);
for(int i = 1; i <= n; i++){
fin >> op;
if(op == 1){
fin >> x;
elem[++cnt] = x;
insert(cnt, list);
}
else if(op == 2){
fin >> x;
del(posarb[x], list);
}
else{
fout << elem[list[0]] << "\n";
}
}
}