Pagini recente » Cod sursa (job #387011) | Cod sursa (job #3122627) | Cod sursa (job #2941088) | Cod sursa (job #2194160) | Cod sursa (job #1491416)
#include <fstream>
#include <vector>
using namespace std;
struct Heap{
public:
Heap();
int top();
void Swap(int x, int y);
void push(int val);
void up(int down);
void pop(int poz);
void down(int up);
private:
int n, el;
vector<int> h, nr, p;
}h;
Heap::Heap() : n(0), el(0)
{
h.push_back(0);
p.push_back(0);
nr.push_back(0);
}
int Heap::top()
{
return nr[h[1]];
}
void Heap::Swap(int x, int y)
{
swap(h[x], h[y]);
swap(p[h[x]], p[h[y]]);
}
void Heap::push(int val)
{
h.push_back(++el);
p.push_back(++n);
nr.push_back(val);
up(n);
}
void Heap::up(int down)
{
int up = down / 2;
while ( up && nr[h[up]] > nr[h[down]] )
{
Swap(up, down);
down = up;
up /= 2;
}
}
void Heap::pop(int elem)
{
if ( p[elem] == n )
{
--n;
h.pop_back();
return;
}
h[p[elem]] = h[n--];
p[h[p[elem]]] = p[elem];
h.pop_back();
down(p[elem]);
}
void Heap::down(int up)
{
int down = 2 * up;
while ( ( down <= n && nr[h[up]] > nr[h[down]] ) || ( down < n && nr[h[up]] > nr[h[down+ 1]] ) )
{
if ( down < n && nr[h[down]] > nr[h[down + 1]] )
++down;
Swap(up, down);
up = down;
down *= 2;
}
}
ifstream is("heapuri.in");
ofstream os("heapuri.out");
int main()
{
int m, tip, val;
is >> m;
while ( m-- )
{
is >> tip;
if ( tip != 3 )
{
is >> val;
if ( tip == 1 )
h.push(val);
else
h.pop(val);
}
else
os << h.top() << "\n";
}
is.close();
os.close();
return 0;
}