Pagini recente » Cod sursa (job #2990811) | Cod sursa (job #763502) | Cod sursa (job #1249694) | Cod sursa (job #2631423) | Cod sursa (job #2811443)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
vector<int> heap(1, 0), elem(1, 0);
bool isempty()
{
return heap.size() == 1;
}
void up(int pos)
{
if(isempty())
{
cout<<"eroare- empty";
return;
}
while(pos > 1 && heap[pos] > heap[pos/2])
{
swap(heap[pos], heap[pos/2]);
swap(elem[pos], elem[pos/2]);
pos /= 2;
}
}
void down(int pos)
{
while(2*pos < heap.size())
{
int maxim = 2*pos;
if(2*pos+1 < heap.size() && heap[2*pos] < heap[2*pos+1])
{
maxim = 2*pos+1;
}
if(heap[pos] >= heap[maxim])
{
break;
}
else
{
swap(heap[pos], heap[maxim]);
swap(elem[pos], elem[maxim]);
pos = maxim;
}
}
}
void ins(int nr)
{
heap.push_back(nr);
elem.push_back(elem.size());
if(!isempty())
up(heap.size()-1);
}
void pop(int nr)
{
if(isempty())
{
cout<<"eroare- empty";
return;
}
int len = elem.size();
for(int i=1; i<len; i++)
{
if(nr == elem[i])
{
nr = i;
break;
}
}
swap(heap[nr], heap[heap.size()-1]);
swap(elem[nr], elem[heap.size()-1]);
heap.pop_back();
elem.pop_back();
if(nr > 1 && heap[nr] > heap[nr/2])
up(nr);
else
down(nr);
}
int top()
{
if(isempty())
{
cout<<"eroare- empty";
return -1;
}
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;
ins(-nr);
}
if(op == 2)
{
cin>>nr;
pop(nr);
}
if(op == 3)
{
cout<<(-1)*top()<<'\n';
}
}
return 0;
}