Pagini recente » Cod sursa (job #3290244) | Cod sursa (job #2636869) | Cod sursa (job #3204807) | Cod sursa (job #1588945) | Cod sursa (job #1053090)
#include<iostream>
#include<fstream>
#define Nmax 200001
using namespace std;
int vec[Nmax],n,nr,ot[Nmax],nrcrt;
struct heap
{
int val,crt; //crt pentru al catelea elemente inserat este
}h[Nmax];
void urca(int poz,int n)
{
heap aj;
int aj2;
if(poz>1)
if(h[poz].val<h[poz/2].val)
{
aj=h[poz];
h[poz]=h[poz/2];
h[poz/2]=aj;
//interschimbare cu un heap aj auxiliar
aj2=ot[h[poz].crt];
ot[h[poz].crt]=ot[h[poz/2].crt];
ot[h[poz/2].crt]=aj2;
urca(poz/2,n);
}
}
int minim(int poz,int n) //minimul dintre fii
{
if(2*poz+1<=n)
if(h[2*poz].val<h[2*poz+1].val)
return 2*poz;
else
return 2*poz+1;
else
return 2*poz;
}
void coboara(int poz,int n)
{
int aj,aj2;
heap z;
if(2*poz<=n)
{
aj=minim(poz,n);
if(h[aj].val<h[poz].val)
{
z=h[aj];
h[aj]=h[poz];
h[poz]=z;
//interschimbare
aj2=ot[h[aj].crt];
ot[h[aj].crt]=ot[h[poz].crt];
ot[h[poz].crt]=aj2;
coboara(aj,n);
}
}
}
int main()
{
int op,val; //operatie , valoare (doar pt operatie 1 si 2)
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>op;
switch(op) //triaza operatia
{
case 1:{
fin>>val;
nr++;
nrcrt++;
h[nr].val=val;
h[nr].crt=nrcrt;
ot[nrcrt]=nr;
urca(nr,nr);
}break;
case 2:{
fin>>val;
h[ot[val]]=h[nr];
ot[h[nr].crt]=ot[val];
nr--;
coboara(ot[val],nr);
}break;
case 3: fout<<h[1].val<<"\n";
break;
}
}
return 0;
}