Pagini recente » Cod sursa (job #1747296) | Cod sursa (job #344769) | Cod sursa (job #1678963) | Cod sursa (job #437867) | Cod sursa (job #1325459)
#include <fstream>
#define DIM 200001
using namespace std;
int n,c,x,H[DIM],hp,poz[DIM],cr,nr[DIM];
// poz[i] = pozitia in heap a elem cu nr de ordine i
// nr[i] = nr de ordine al elem. de pe pozitia i in heap
// H[i] = valoarea elementului de pe pozitia i in heap
void addHeap(int k)
{
//k = valoarea elementului
++hp;
++cr;
int q=hp;
while(k< H[q/2])
{
H[q]=H[q/2];
nr[q]=nr[q/2];
poz[nr[q]]=q;
q/=2;
}
H[q]=k;
nr[q]=cr;
poz[cr]=q;
}
void delHeap(int k)
{
// k = nr de ordine
int p=poz[k]; //pozitia elementului cu nr de ordine k
H[p]=H[hp];
nr[p]=nr[hp];
poz[nr[p]]=p;
while(H[p] < H[p/2] && p>1)
{
swap(H[p],H[p/2]);
swap(nr[p],nr[p/2]);
swap(poz[nr[p]],poz[nr[p/2]]);
p/=2;
}
while((H[p] > H[p*2] || H[p] > H[p*2+1] ) && 2*p<=hp)
{
if((H[p*2] < H[p*2 +1] && 2*p<=hp) || p*2+1> hp)
{
swap(H[p],H[p*2]);
swap(nr[p],nr[p*2]);
swap(poz[nr[p]],poz[nr[p*2]]);
p*=2;
}
else if(2*p+1<=hp)
{
swap(H[p],H[p*2+1]);
swap(nr[p],nr[p*2+1]);
swap(poz[nr[p]],poz[nr[p*2+1]]);
p=p*2+1;
}
}
}
int main()
{
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
fscanf(f,"%d",&n);
for(int i=1;i<=n;++i)
{
fscanf(f,"%d",&c);
if(c==1)
{
fscanf(f,"%d",&x);
// x- elementul nou
addHeap(x);
}
else if(c==2)
{
fscanf(f,"%d",&x);
// x- pozitia in vectorul v
delHeap(x);
}
else
fprintf(g,"%d\n", H[1]);
}
fclose(f);
fclose(g);
return 0;
}