Pagini recente » Cod sursa (job #2873579) | Cod sursa (job #3240808) | Cod sursa (job #762351) | Cod sursa (job #18987) | Cod sursa (job #2925406)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
int elemCount = 1;
void insert(std::vector<int>& heap, int elem,std::vector<int>& ord){
if (heap.size()==0){
heap.push_back(elem);
ord[heap.size()-1] = elemCount;
elemCount++;
return;
}
heap.push_back(elem);
ord[heap.size()-1] = elemCount;
elemCount++;
for(int i = (heap.size()-1); i >= 0 ; i = i/2){
if(heap[i] > heap[i/2]){
int temp = heap[i/2];
int temp2 = ord[i/2];
heap[i/2] = heap[i];
ord[i/2] = ord[i];
heap[i] = temp;
ord[i] = temp2;
}else{
return;
}
}
}
void del(std::vector<int>& heap, int pos, std::vector<int>& ord){
if(heap.size() == 0){
return;
}
if(heap.size() == 1){
heap.pop_back();
ord.pop_back();
return;
}
auto index = (ord.begin() - std::find(ord.begin(),ord.end(),pos))*(-1);
heap[index] = heap[heap.size()-1];
ord[index] = ord[heap.size()-1];
heap.pop_back();
ord[heap.size()] = 0;
for(int i = pos; i < heap.size(); i = i*2){
if(heap[i] < heap[i*2]){
int temp = heap[i*2];
int temp2 = ord[i*2];
heap[i*2] = heap[i];
ord[i*2] = ord[i];
heap[i] = temp;
ord[i] = temp2;
}
if(heap[i] < heap[i*2 + 1]){
int temp = heap[i*2 + 1];
int temp2 = ord[i*2 + 1];
heap[i*2 + 1] = heap[i];
ord[i*2 + 1] = ord[i];
heap[i] = temp;
ord[i] = temp2;
}
}
}
int min(std::vector<int>& heap){
return heap[heap.size()-1];
}
int main(){
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");
int n;
fin >> n;
std::vector<int> heap;
std::vector<int> ord(n,NULL);
while(!fin.eof()){
int op;
fin >> op;
switch(op){
case 1:
int elem;
fin >> elem;
insert(heap,elem,ord);
break;
case 2:
int pos;
fin >> pos;
del(heap,pos,ord);
break;
case 3:
fout << min(heap) << std::endl;
break;
}
}
fin.close();
fout.close();
return 0;
}