Pagini recente » Cod sursa (job #2863076) | Cod sursa (job #426051) | Cod sursa (job #1197764) | Cod sursa (job #2153555) | Cod sursa (job #2492044)
#include <fstream>
#include <vector>
using namespace std;
vector<int> heap;
vector<int> order;
void swap(int i, int j){
int aux = heap[i];
heap[i] = heap[j];
heap[j] = aux;
}
void inserth(int x){
heap.push_back(x);
int k = heap.size()-1;
while(k){
if(heap[(k-1)>>1]>heap[k]){
swap(k, (k - 1) >> 1);
order[(k - 1) >> 1] = k;
k--;
k>>=1;
}else break;
}
order.push_back(k);
}
void deleteh(int x){
int k = order[x-1];
swap(k, heap.size()-1);
heap.pop_back();
if(heap[k]<heap[(k-1)>>1]){
while(heap[k]<heap[(k-1)>>1]){
swap(k, (k-1)>>1);
k--;
k>>=1;
}
}else{
while(1){
int mini = heap[k], minip = k;
if((k<<1)+1>=heap.size()) break;
if(heap[(k<<1)+1]<mini){
mini = heap[(k<<1)+1];
minip = (k<<1)+1;
}
if((k<<1)+2<heap.size() && heap[(k<<1)+2]<mini){
mini = heap[(k<<1)+2];
minip = (k<<1)+2;
}
if(minip==k) break;
swap(k, minip);
k = minip;
}
}
}
int main() {
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n, op, x;
cin>>n;
for(int i=0;i<n;i++){
cin>>op;
if(op==1){
cin>>x;
inserth(x);
}else if(op==2){
cin>>x;
deleteh(x);
}else
cout<<heap.front()<<'\n';
}
return 0;
}