Pagini recente » Cod sursa (job #1329840) | Cod sursa (job #2042337) | Cod sursa (job #1777089) | Cod sursa (job #2046389) | Cod sursa (job #2506582)
#include <fstream>
#define N 200012
using namespace std;
int heap[N],where[N],intr[N],n,cate;
void sift(int x, int i, int ord)
{
int son,alc;
do
{
son=0;
if(2*i<=cate)//are fiu stang
{
son=2*i;
if(2*i+1<=cate && heap[2*i+1]<heap[2*i])
son=2*i+1;
}
if(son && x>heap[son])
{
heap[i]=heap[son];
alc=where[son];
intr[alc]=i;
where[i]=alc;
i=son;
}
else
son=0;
}while(son!=0);
heap[i]=x;
where[i]=ord;
intr[ord]=i;
}
void percolate(int x, int i, int ord)
{
int alc;
while(i>1 && x<heap[i/2])
{
heap[i]=heap[i/2];
alc=where[i/2];
intr[alc]=i;
where[i]=alc;
i/=2;
}
heap[i]=x;
intr[ord]=i;
where[i]=ord;
}
void cut(int ord)
{
int i=intr[ord];
heap[i]=heap[cate];
ord=where[cate];
intr[ord]=i;
where[i]=ord;
--cate;
if(i>1 && heap[i]<heap[i/2])
percolate(heap[i],i,ord);
else
sift(heap[i],i,ord);
}
void put(int x,int i, int ord)
{
heap[i]=x;
intr[ord]=i;
where[i]=ord;
percolate(x,i,ord);///cand inserezi valoarea e pusa tot timpul ultima si atunci compari mereu doar cu tata
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int x,cod,ord=0,which,i=0;
f>>n;
for(int k=1;k<=n;++k)
{
f>>cod;
if(cod==1)
{
f>>x;
put(x,++cate,++ord);
}
else
if(cod==2)
{
f>>which;
cut(which);
}
else
g<<heap[1]<<"\n";
}
f.close();
g.close();
return 0;
}