Pagini recente » Cod sursa (job #2815217) | Cod sursa (job #2030212) | Cod sursa (job #2182496) | Cod sursa (job #423022) | Cod sursa (job #1316643)
#include <iostream>
#include <fstream>
using namespace std;
#define maxn 500000
int c=0;
int h[maxn], poz[maxn], val[maxn];
void put(int n)
{
while (val[h[n/2]]>val[h[n]] && n>1)
{
swap(h[n/2], h[n]);
poz[h[n/2]]=n/2;
poz[h[n]]=n;
n=n/2;
}
}
void take(int n)
{
if (h[2*n] && h[2*n+1])
{
if (val[h[2*n]]>val[h[2*n+1]])
{
swap(h[n], h[2*n+1]);
poz[h[n]]=n;
poz[h[2*n+1]]=2*n+1;
take(2*n+1);
}
else
{
swap(h[n], h[2*n]);
poz[h[n]]=n;
poz[h[2*n]]=2*n;
take(2*n);
}
}
else
{
if (h[2*n])
{
h[n]=h[2*n];
poz[h[n]]=n;
poz[h[2*n]]=2*n;
h[2*n]=h[c];
h[c]=0;
if (2*n!=c) put(2*n);
else {h[2*n]=0;}
}
else
{
h[n]=h[c];
poz[h[n]]=n;
h[c]=0;
put(n);
}
}
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, op, x, i, j;
f>>n;
for (i=1;i<=n;i++)
{
f>>op;
if (op==3) g<<val[h[1]]<<'\n';
else
{
f>>x;
if (op==2) {take(poz[x]); c--;}
if (op==1) {c++; h[c]=c; val[c]=x; poz[c]=c; put(c); }
}
//for (j=1;j<=c;j++) cout<<poz[j]<<' ';
//cout<<endl;
}
}