Pagini recente » Cod sursa (job #2175788) | Cod sursa (job #1448243) | Cod sursa (job #2338041) | Cod sursa (job #1408470) | Cod sursa (job #2183292)
#include <fstream>
using namespace std;
struct heap
{
int x,y;
}v[200002];
int poz[200002],m,OK,x,t,r,n,i;
void up(int a)
{
while(v[a].x<v[a/2].x && a>=2)
{
m=v[a/2].x;
v[a/2].x=v[a].x;
v[a].x=m;
m=v[a].y;///am interschimbat valorile dintre copil si parinte
v[a].y=v[a/2].y;
v[a/2].y=m;///am interschimbat pozitiile dintre copil si parinte
poz[v[a/2].y]=a/2;
poz[v[a].y]=a;///am reactualizat pe ce pozitie in heap se afla nr dupa schimbare
a=a/2;
}
}
void down(int a)
{
while((v[a].x>v[2*a].x || v[a].x>v[2*a+1].x) && a<=n/2)
{
if(v[2*a].x>v[2*a+1].x)
OK=1;
m=v[2*a+OK].x;
v[2*a+OK].x=v[a].x;
v[a].x=m;
m=v[a].y;
v[a].y=v[2*a+OK].y;
v[2*a+OK].y=m;
poz[v[2*a+OK].y]=2*a+OK;
poz[v[a].y]=a;
a=2*a+OK;
OK=0;
}
}
void cut(int a)
{
v[a].x=v[n].x;
v[a].y=v[n].y;
poz[v[a].y]=a;
n--;///inlocuiesc nr ce trb eliminat cu ultimul nr din heap
if(v[a].x<v[a/2].x)
up(a);
else
if(v[a].x>v[2*a].x || v[a].x>v[2*a+1].x)
down(a);
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>t;int a=0;
for(i=1;i<=t;i=i+1)
{
f>>x;
if(x==1)
{
f>>a;
v[++n].x=a;///pun noul nr in heap
v[n].y=++r;///salvez si nr de ordine al numarului adaugat
poz[r]=n;///al "r"-lea nr adugat se afla pe pozitia n in heap
up(n);
}
if(x==2)
{
f>>a;
cut(poz[a]);
}
if(x==3)
g<<v[1].x<<'\n';
}
return 0;
}