Pagini recente » Cod sursa (job #749380) | Cod sursa (job #3234219) | Cod sursa (job #3250537) | Cod sursa (job #2049650) | Cod sursa (job #1784882)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("heapuri.in");
ofstream t ("heapuri.out");
vector <pair<int,int> > v(1);
vector <bool> vaz(1);
int n,c=0;
void up_heap(int target){
int nod;
nod=v.size();
v.push_back({target,++c});
vaz.push_back(false);
while (v[nod].first<v[nod/2].first and nod>1){
swap(v[nod],v[nod/2]);
nod/=2;}
}
void down_heap(int nod){int nr=v.size()-1;
while(true)
{
int fiu=nod;
if(nod*2<=nr and v[nod*2].first<v[fiu].first) fiu=nod*2;
if(nod*2+1<=nr and v[nod*2+1].first<v[fiu].first) fiu=nod*2+1;
if(fiu==nod) return;
swap(v[nod],v[fiu]);
nod=fiu;
}
}
int main()
{ int query;
f>>n;
for (int i=0;i<n;++i){
f>>query;
switch(query){
case 1:{f>>query;up_heap(query);break;}
case 2:{f>>query;vaz[query]=true;break;}
case 3:{while(vaz[v[1].second])
{
swap(v[1],v.back());
v.pop_back();
down_heap(1);
}
t<<v[1].first<<'\n';break;}
}
}
return 0;
}