Pagini recente » Cod sursa (job #275239) | Cod sursa (job #45740) | Cod sursa (job #1657084) | Istoria paginii runda/pregatire_oni_liceu | Cod sursa (job #1260779)
#include <fstream>
#define NMax 200001
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, op, H[NMax], i, j, ord[NMax], v[NMax], p[NMax], k;
inline int left_son(int nod)
{
return 2*nod;
}
inline int right_son(int nod)
{
return 2*nod+1;
}
inline int father(int nod)
{
return nod/2;
}
void inters(int nod1, int nod2)
{
swap (H[nod1], H[nod2]);
swap (p[H[nod1]], p[H[nod2]]);
}
void sus(int nod)
{
while (nod>1 && v[H[nod]] < v[H[father(nod)]]) {
inters(nod, father(nod));
nod=father(nod);
}
}
void jos(int nod)
{
int st=left_son(nod), dr=0;;
while (st<=k) {
int Max=nod;
if (v[H[st]] < v[H[Max]])
Max=st;
dr=right_son(nod);
if (dr<=k && v[H[dr]] < v[H[Max]])
Max=dr;
if (Max!=nod) {
inters (nod, Max);
nod=Max;
st=left_son(nod);
}
else
return;
}
}
void sterge(int nod)
{
if (father(nod) >= 1 && v[H[nod]]<v[H[father(nod)]])
sus(nod);
else
jos(nod);
}
int main()
{ int nr=0;
f>>n;
for (i=1; i<=n; i++) {
f>>op;
if (op==1) {
f>>v[++nr];
k++;
H[k]=nr;
p[nr]=k;
sus (k);
}
else if (op==2) {
int no;
f>>no;
H[p[no]]=H[k];
p[H[k]]=p[no];
k--;
sterge (p[no]);
}
else
g<<v[H[1]]<<"\n";
}
return 0;
}