Pagini recente » Cod sursa (job #1422531) | Cod sursa (job #2806799) | Cod sursa (job #1680190) | Cod sursa (job #1232846) | Cod sursa (job #3129110)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream in("heap.in");
ofstream out("heap.out");
class Heap
{
public:
vector<int> heap;
void push(int val)
{
heap.push_back(val);
sift_up(heap.size() - 1);
}
int pop()
{
if (heap.size() == 0)
return 0;
else if (heap.size() == 1)
{
int aux = heap.back();
heap.pop_back();
return aux;
}
int val_min = heap[0];
int aux = heap.back();
heap.pop_back();
heap[0] = aux;
sift_down(0);
return val_min;
}
void sift_down(int i)
{
while (2 * i + 1 < heap.size())
{
int l_i = 2 * i + 1;
int r_i = 2 * i + 2;
int min_child = l_i;
if (r_i < heap.size() && heap[r_i] < heap[l_i])
min_child = r_i;
if (heap[i] > heap[min_child])
{
swap(heap[i], heap[min_child]);
i = min_child;
}
else
break;
}
}
void sift_up(int i)
{
while (i > 0)
{
int parent_i = (i - 1) / 2;
if (heap[parent_i] > heap[i])
{
swap(heap[parent_i], heap[i]);
i = parent_i;
}
else
break;
}
}
void remove(int x)
{ int i;
for(i=0;i<heap.size();i++)
if(heap[i]==x)
break;
swap(heap[i],heap.back());
heap.pop_back();
sift_down(i);
}
};
vector <int> v;
int main()
{
Heap my_heap;
int n;
in>>n;
for(int i=0;i<n;i++)
{ int x,y;
in>>x;
if(x==1)
{ in>>y;
v.push_back(y);
my_heap.push(y);}
else if(x==2)
{
in>>y;
my_heap.remove(v[y]);
}
else out<<my_heap.pop()<<endl;
}
}