Pagini recente » Cod sursa (job #1999399) | Borderou de evaluare (job #3117081) | Diferente pentru problema/minlcm intre reviziile 2 si 1 | Cod sursa (job #1080776) | Cod sursa (job #2506738)
#include <fstream>
#define N 200012
using namespace std;
int heap[N],where[N],intr[N],cate;
void down(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])
{
swap(heap[i],heap[son]);
alc=where[son];
intr[alc]=i;
intr[ord]=son;
where[i]=alc;
where[son]=ord;
i=son;
}
else
son=0;
}while(son!=0);
}
void up(int x, int i, int ord)
{
int alc;
while(i>1 && x<heap[i/2])
{
swap(heap[i],heap[i/2]);
alc=where[i/2];
intr[alc]=i;
intr[ord]=i/2;
where[i]=alc;
where[i/2]=ord;
i/=2;
}
}
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])
up(heap[i],i,ord);
else
down(heap[i],i,ord);
}
void put(int x,int i, int ord)
{
heap[i]=x;
intr[ord]=i;
where[i]=ord;
up(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,n;
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;
}