Pagini recente » Cod sursa (job #101844) | Cod sursa (job #2355112) | Cod sursa (job #2414484) | Cod sursa (job #2632128) | Cod sursa (job #3149359)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int N_MAX = 2e5;
const int INSERT = 1;
const int ERASE = 2;
const int QUERY = 3;
struct Node{
int data;
int index;
bool operator<(const Node& other) const{
return data < other.data;
}
};
int pos[N_MAX];
Node heap[N_MAX];
int heapSize;
inline int parent(int i){
return (i - 1) / 2;
}
inline int leftChild(int i){
return 2 * i + 1;
}
inline int rightChild(int i){
return 2 * i + 2;
}
void upHeap(int i){
while(i && heap[i] < heap[parent(i)]){
swap(pos[heap[parent(i)].index], pos[heap[i].index]);
swap(heap[parent(i)], heap[i]);
i = parent(i);
}
}
void downHeap(int i){
int smallest = i, left = leftChild(i), right = rightChild(i);
if(left < heapSize && heap[left] < heap[smallest])
smallest = left;
if(right < heapSize && heap[right] < heap[smallest])
smallest = right;
if(smallest != i){
swap(pos[heap[smallest].index], pos[heap[i].index]);
swap(heap[smallest], heap[i]);
downHeap(smallest);
}
}
void insert(Node x){
heap[heapSize++] = x;
pos[x.index] = heapSize - 1;
upHeap(pos[x.index]);
}
void erase(int i){
swap(heap[i], heap[heapSize - 1]);
swap(pos[heap[i].index], pos[heap[heapSize - 1].index]);
--heapSize;
upHeap(i);
downHeap(i);
}
int query(){
return heap[0].data;
}
int main(){
heapSize = 0;
int queries, op, x, n = 0;
fin >> queries;
for(int i = 0; i < queries; ++i){
fin >> op;
if(op != QUERY){
fin >> x;
if(op == INSERT){
insert({x, n});
++n;
}else{
erase(pos[x - 1]);
}
}else
fout << query() << '\n';
}
return 0;
}