Pagini recente » Cod sursa (job #455897) | Cod sursa (job #683674) | Cod sursa (job #1806990) | Cod sursa (job #1581712) | Cod sursa (job #776695)
Cod sursa(job #776695)
#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
elem z=h[k];
h[k]=h[min];
h[min]=z;
poz[ne]=min;
}
else break;
}
--ne;
}
int main()
{
f>>n;
for(int i=1;i<=n;++i)
{
int op,x;
f>>op;
switch(op)
{
case 1:
f>>h[++ne].x;
h[ne].nr=ne;poz[ne]=ne;
urc(ne);break;
case 2:
f>>x;cobor(poz[x]);break;
case 3:
g<<h[1].x<<'\n';break;
}
}
return 0;
}