Pagini recente » Cod sursa (job #520727) | Cod sursa (job #570634) | Cod sursa (job #1945693) | Istoria paginii runda/mereuafectatemotional/clasament | Cod sursa (job #950178)
Cod sursa(job #950178)
#include <algorithm>
#include <fstream>
#define NMAX 200001
using namespace std;
class heap
{
private:
int sz;
int num_of_inserts;
vector<pair<int,int>> el;
vector<int> el_pos;
void el_swap(int pos_a, int pos_b)
{
swap(el_pos[el[pos_a].second], el_pos[el[pos_b].second]);
swap(el[pos_a], el[pos_b]);
}
public:
heap()
{
sz = 0;
num_of_inserts = 0;
el = vector<pair<int,int>>(NMAX);
el_pos = vector<int>(NMAX);
}
void bubble_up(int s)
{
for(auto f=s>>1; s>1 && el[f].first>el[s].first; s>>=1, f=s>>1)
el_swap(s, f);
}
void bubble_down(int f)
{
for(;;)
{
int l=f<<1, r=l+1, nf=f;
if(l==sz || (l<sz && el[l].first<el[r].first))
nf=l;
else if(r<=sz && el[r].first<el[l].first)
nf=r;
if(nf!=f && el[nf].first<el[f].first)
el_swap(f, nf), f=nf;
else
return;
}
}
void push(int val)
{
el[++sz]=pair<int,int>(val, ++num_of_inserts);
el_pos[num_of_inserts]=sz;
bubble_up(sz);
}
int peek()
{
return el[1].first;
}
void pop(int t)
{
int f=el_pos[t];
el_swap(f, sz--);
if(f>1 && el[f>>1].first>el[f].first)
bubble_up(f);
else
bubble_down(f);
}
};
int main()
{
int n, op, arg;
heap h;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
fin>>n;
while(n--)
{
fin>>op;
switch(op)
{
case 1:
fin>>arg;
h.push(arg);
break;
case 2:
fin>>arg;
h.pop(arg);
break;
case 3:
fout<<h.peek()<<"\n";
break;
}
}
return 0;
}