Pagini recente » Cod sursa (job #3171589) | Cod sursa (job #1575655) | Cod sursa (job #1799824) | Cod sursa (job #2892932) | Cod sursa (job #3131674)
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <climits>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
class Heap{
private:
vector<int> h,ord;
int parent(int i){ return(i-1)/2; }
int getst(int i){ return 2*i+1; }
int getdr(int i){ return 2*(i+1); }
void heapify(int i){
int min=i;
int st=getst(i);
int dr=getdr(i);
if(st<h.size() && h[st]<h[min])
min=st;
if(dr<h.size() && h[dr]<h[min])
min=dr;
if(min!=i){
swap(h[i],h[min]);
heapify(min);
}
}
void helperRemove(int i){
h[i]=INT_MIN;
while(i!=0&&h[parent(i)]>h[i]){
swap(h[i],h[parent(i)]);
i=parent(i);
}
}
public:
void insert(int val){
h.push_back(val);
ord.push_back(val);
int i=h.size()-1;
while(i!=0 && h[parent(i)]>h[i]){
swap(h[i],h[parent(i)]);
i=parent(i);
}
}
void removeat(int x){
int i;
for(i=0;i<h.size();i++)
if(h[i]==ord[x-1])
break;
helperRemove(i);
h[0]=h[h.size()-1];
h.pop_back();
heapify(0);
}
int getFirst(){
return h[0];
}
};
int main(){
int n,s,v;
Heap h;
fin>>n;
for(int i=0;i<n;i++)
{
fin>>s;
switch(s){
case 1:
fin>>v;
h.insert(v);
break;
case 2:
fin>>v;
h.removeat(v);
break;
case 3:
fout<<h.getFirst()<<"\n";
}
}
return 0;
}