Pagini recente » Cod sursa (job #358580) | Cod sursa (job #3278528) | Cod sursa (job #2711024) | Cod sursa (job #1982504) | Cod sursa (job #1042890)
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n, t, x, h[200001], e[200001], p[200001], l, v, k;
void push(int x, int &l, int &k)
{
int i=0;
i=++l;
h[i]=x;
while(h[i/2]>h[i] && i>1)
{
swap(h[i/2], h[i]);
swap(p[i], p[i/2]);
e[p[i]]=i;
e[p[i/2]]=i/2;
i/=2;
}
e[++k]=i;
p[i]=k;
}
bool minim(int i, int &j)
{
if(i*2>l) return 0;
else
{
if(i*2+1>l) j=i*2;
else
if(h[i*2]<h[i*2+1]) j=i*2;
else j=i*2+1;
return 1;
}
}
void pop(int i)
{
int j=0;
bool k=0;
h[i]=h[l];
p[i]=p[l];
e[p[i]]=i;
h[l--]=0;
k=minim(i, j);
while(i<=l && h[i]>h[j] && k)
{
swap(h[i], h[j]);
swap(p[i], p[j]);
e[p[i]]=i;
e[p[j]]=j;
i=j;
k=minim(i, j);
}
}
int main()
{
for(cin>>n; n>0; n--)
{
cin>>t;
if(t==3) cout<<h[1]<<'\n';
else
{
cin>>x;
if(t==1) push(x, l, k);
else pop(e[x]);
}
}
return 0;
}