Pagini recente » Cod sursa (job #1301542) | Cod sursa (job #2124788) | Cod sursa (job #1424756) | Cod sursa (job #147516) | Cod sursa (job #395900)
Cod sursa(job #395900)
#include<fstream.h>
#define dmax 200001
long min=1000000001,min2=1000000001,sf,heap[dmax],poz[dmax],v[dmax];
void inserare(long k) /*inserarea elementului cu valoarea k*/
{
long aux,auxsf;
sf++;
heap[sf]=k;
poz[sf]=sf;
v[sf]=sf;
auxsf=sf;
while (heap[auxsf]<heap[auxsf/2] && auxsf>=2) /*aranjez heapul*/
{
aux=heap[auxsf];
heap[auxsf]=heap[auxsf/2];
heap[auxsf/2]=aux;
v[poz[auxsf/2]]=auxsf;
v[poz[auxsf]]=auxsf/2;
aux=poz[auxsf];
poz[auxsf]=poz[auxsf/2];
poz[auxsf/2]=aux;
auxsf=auxsf/2;
}
}
void stergere(int k) /*stergerea elementului adaugat al k-lea in heap*/
{
long aux,auxsf;
heap[v[k]]=heap[sf];
poz[v[k]]=poz[sf];
v[poz[sf]]=v[k];
sf--;
auxsf=v[k];
while (heap[auxsf]<heap[auxsf/2] && auxsf>=2) /*aranjarea heapului in functie de tata*/
{
aux=heap[auxsf];
heap[auxsf]=heap[auxsf/2];
heap[auxsf/2]=aux;
v[poz[auxsf/2]]=auxsf;
v[poz[auxsf]]=auxsf/2;
aux=poz[auxsf];
poz[auxsf]=poz[auxsf/2];
poz[auxsf/2]=aux;
auxsf=auxsf/2;
}
while ((heap[auxsf]>heap[auxsf*2] || heap[auxsf]>heap[auxsf*2+1]) && auxsf<=sf/2) /*aranjarea heapului in functie de fii*/
{
if (heap[auxsf]>heap[auxsf*2]) /*fiul din stanga*/
{
aux=heap[auxsf];
heap[auxsf]=heap[auxsf*2];
heap[auxsf*2]=aux;
v[poz[auxsf*2]]=auxsf;
v[poz[auxsf]]=auxsf*2;
aux=poz[auxsf];
poz[auxsf]=poz[auxsf*2];
poz[auxsf*2]=aux;
auxsf=auxsf*2;
} else
{ /*fiul din dreapta*/
aux=heap[auxsf];
heap[auxsf]=heap[auxsf*2+1];
heap[auxsf*2+1]=aux;
v[poz[auxsf*2+1]]=auxsf;
v[poz[auxsf]]=auxsf*2+1;
aux=poz[auxsf];
poz[auxsf]=poz[auxsf*2+1];
poz[auxsf*2+1]=aux;
auxsf=auxsf*2+1;
}
}
}
int main()
{
long n,i,op,nr;
ifstream fin("heapuri.in");
fin>>n;
ofstream fout("heapuri.out");
for (i=1; i<=n; i++)
{
fin>>op;
if (op==1)
{
fin>>nr;
inserare(nr);
} else
if (op==2)
{
fin>>nr;
stergere(nr);
} else
fout<<heap[1]<<'\n';
}
fin.close();
fout.close();
return 0;
}