Pagini recente » Cod sursa (job #3036365) | Cod sursa (job #935626) | Cod sursa (job #1735018) | Cod sursa (job #344412) | Cod sursa (job #2766482)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int poz[200002],ind[200002],h[200002],z,n;
int father(int n)
{
return n/2;
}
int rightson(int n)
{
return n*2+1;
}
int leftson(int n)
{
return n*2;
}
void percolate(int k)
{
int key=h[k],ii=ind[k];
while(key<h[father(k)]&&k>1)
{
h[k]=h[father(k)];
poz[ind[father(k)]]=k;
ind[k]=ind[father(k)];
k=father(k);
}
h[k]=key;
ind[k]=ii;
poz[ii]=k;
}
void sift(int k)
{
int son,key=h[k],ii=ind[k];
do
{
son=0;
if(leftson(k)<=n)
{
son=leftson(k);
if(son+1<=n&&h[son+1]<h[son])
son+=1;
if(h[son]>=h[k])
son=0;
}
if(son)
{
swap(h[k],h[son]);
k=son;
}
}while(son);
h[k]=key;
poz[ii]=k;
ind[k]=ii;
}
void sterg(int k)
{
h[poz[k]]=h[n];
poz[ind[n]]=poz[k];
ind[poz[k]]=ind[n];
n--;
percolate(poz[k]);
sift(poz[k]);
}
void inserez(int x)
{
h[++n]=x;
++z;
ind[n]=z;
poz[z]=n;
}
void afismin()
{
fout<<h[1]<<'\n';
}
int main()
{
int op,nr,x,i;
fin>>nr;
for(i=1;i<=nr;i++)
{
fin>>op;
if(op==1)
{
fin>>x;
inserez(x);
percolate(n);
}
else
if(op==2)
{
fin>>x;
sterg(x);
}
else
afismin();
}
return 0;
}