Pagini recente » Cod sursa (job #1312931) | Cod sursa (job #2754635) | Cod sursa (job #1212550) | Cod sursa (job #43368) | Cod sursa (job #776767)
Cod sursa(job #776767)
#include<fstream>
using namespace std;
#define NMAX 200005
ifstream f("heapuri.in");
ofstream g("heapuri.out");
struct elem{
int x,nr;
};
elem h[NMAX];
int n, poz[NMAX],ne=0;
void urc(int k)
{
if(k/2)//daca exista tata (nu este radacina)
if(h[k/2].x>h[k].x) //daca este mai mic decat tatal
{//le interschimbam
poz[h[k].nr]=k/2;poz[h[k/2].nr]=k;
elem z=h[k];
h[k]=h[k/2];
h[k/2]=z;
urc(k/2);
}
}
void cobor(int k)
{
//trecem ultimul element pe poz k
h[k]=h[ne];poz[h[ne].nr]=k;
//coboram elem de pe k pana sta bine
while(2*k<=ne)//are cel putin un fiu
{
int min=2*k;// cel mai mic fiu
if(2*k+1<=ne)
{
if(h[min].x>h[2*k+1].x)min=2*k+1;
}
if(h[k].x>h[min].x)//este mai mare decat cel mai mic fiu
{//interschimbam cu fiul
poz[h[k].nr]=min;poz[h[min].nr]=k;
elem z=h[k];
h[k]=h[min];
h[min]=z;
}
else break;
}
--ne;
}
int main()
{
f>>n;
int nr=0;//nr elementului introdus
//ne nr elementelor din heap
for(int i=1;i<=n;++i)
{
int op,x;
f>>op;
switch(op)
{
case 1:
f>>h[++ne].x;
nr++;
h[ne].nr=nr;
poz[nr]=ne;//elementul nr se gaseste pe poz ne in heap
urc(ne);break;
case 2:
f>>x;
cobor(poz[x]);break;
case 3:
g<<h[1].x<<'\n';break;
}
}
return 0;
}