Pagini recente » Cod sursa (job #2043416) | Cod sursa (job #3228642) | Cod sursa (job #3132500) | Cod sursa (job #1170811) | Cod sursa (job #1189577)
#include <cstdio>
#define filein "heapuri.in"
#define fileout "heapuri.out"
using namespace std;
struct elem
{
int x;
int poz;
};
FILE *out;
elem h[200001]; // heap
elem v[200001]; // intrare
int kh,kv;
void afisare();
void adaugare_heap(int);
void eliminare_heap(int);
int main()
{
FILE *in;
in=fopen(filein,"r");
out=fopen(fileout,"w");
int i,mod,x;
int n;
fscanf(in,"%d",&n);
for (i=1; i<=n; i++)
{
fscanf(in,"%d",&mod);
if (mod==3) afisare();
else
{
fscanf(in,"%d",&x);
if (mod==1) adaugare_heap(x);
else eliminare_heap(x);
}
}
fclose(in);
fclose(out);
return 0;
}
void afisare()
{
fprintf(out,"%d\n",h[1].x);
}
void adaugare_heap(int x)
{
kv++;
v[kv].x=x;
kh++;
h[kh].x=x;
h[kh].poz=kv;
v[kv].poz=kh;
int n=kh;
elem aux;
while (h[n].x<h[n/2].x && n>1)
{
aux=h[n];
h[n]=h[n/2];
h[n/2]=aux;
v[h[n/2].poz].poz=n/2;
v[h[n].poz].poz=n;
n=n/2;
}
}
void eliminare_heap(int x)
{
elem aux;
int p;
p=v[x].poz;
v[x].poz=-1;
h[p]=h[kh];
kh--;
v[h[p].poz].poz=p;
int n=p;
int ind;
while (h[n].x<h[n/2].x && n>1)
{
aux=h[n];
h[n]=h[n/2];
h[n/2]=aux;
v[h[n/2].poz].poz=n/2;
v[h[n].poz].poz=n;
n=n/2;
}
while (n<kh/2 && (h[n].x>h[n*2].x || h[n].x>h[n*2+1].x))
{
if (h[2*n].x < h[2*n+1].x)
ind=2*n;
else ind=2*n+1;
aux=h[n];
h[n]=h[ind];
h[ind]=aux;
v[h[ind].poz].poz=ind;
v[h[n].poz].poz=n;
n=ind;
}
if (2*n==kh && h[n].x>h[2*n].x)
{
aux=h[n];
h[n]=h[kh];
h[kh]=aux;
v[h[kh].poz].poz=kh;
v[h[n].poz].poz=n;
}
}