Pagini recente » Cod sursa (job #2194048) | Cod sursa (job #1811486) | Cod sursa (job #791118) | Cod sursa (job #2301426) | Cod sursa (job #2811906)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
vector<int> heap(1, 0), elem(1, 0), v(1, 0);
bool isempty()
{
return heap.size() == 1;
}
void up(int pos)
{
if(isempty())
{
return;
}
while(pos > 1 && v[heap[pos]] < v[heap[pos/2]])
{
swap(heap[pos], heap[pos/2]);
swap(elem[heap[pos]], elem[heap[pos/2]]);
pos /= 2;
}
}
void down(int pos)
{
while(2*pos < heap.size())
{
int minim = 2*pos;
if(2*pos+1 < heap.size() && v[heap[2*pos]] > v[heap[2*pos+1]])
{
minim = 2*pos+1;
}
if(v[heap[pos]] <= v[heap[minim]])
{
break;
}
else
{
swap(heap[pos], heap[minim]);
swap(elem[heap[pos]], elem[heap[minim]]);
pos = minim;
}
}
}
void ins(int nr)
{
heap.push_back(nr);
elem.push_back(heap.size()-1);
if(!isempty())
up(heap.size()-1);
}
void pop(int x)
{
if(isempty())
{
return;
}
int nr = elem[x];
swap(heap[nr], heap[heap.size()-1]);
swap(elem[heap[nr]], elem[heap[heap.size()-1]]);
elem[heap[heap.size()-1]] = 0;
heap.pop_back();
up(nr);
down(nr);
}
int top()
{
if(isempty())
{
return 0;
}
return heap[1];
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
int op, nr;
cin>>op;
if(op == 1)
{
cin>>nr;
v.push_back(nr);
ins(v.size()-1);
}
if(op == 2)
{
cin>>nr;
pop(nr);
}
if(op == 3)
{
cout<<v[top()]<<'\n';
}
}
return 0;
}