Pagini recente » Cod sursa (job #903027) | Cod sursa (job #1426855) | Statistici Muraru Miruna-Elena (MuraruMiruna) | Cod sursa (job #551933) | Cod sursa (job #1368563)
using namespace std;
#include <fstream>
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
#define MAXIM 200015
int heap[MAXIM], lg, v[MAXIM], nr, poz[MAXIM];
void schimba(int a, int b)
{
int aux = heap[a];
heap[a] = heap[b];
heap[b] = aux;
poz[heap[a]] = a;
poz[heap[b]] = b;
}
void adauga(int val)//percolate
{
nr++; lg++;
v[nr] = val; heap[lg] = nr; poz[nr] = lg;
int tata = lg/2, fiu = lg;
while(tata>=1 && v[heap[tata]]>val)
{
schimba(fiu, tata);
fiu = tata;
tata/=2;
}
}
void sterge(int p) // shiftarea aia
{
if(p<0 || p>nr)
return;
poz[heap[p]] = 0;
heap[p] = heap[lg];
poz[heap[p]] = p;
heap[lg] = 0; --lg;
int fiu;
while(2*p<=lg)
{
if(2*p==lg)
{
if(v[heap[2*p]] < v[heap[p]])
schimba(p, 2*p);
return;
}
else
{
fiu = 2*p;
if(v[heap[fiu]]>v[heap[fiu+1]]) // st > dr
fiu++;
if(v[heap[p]]>v[heap[fiu]])
{
schimba(p, fiu);
p = fiu;
}
else
return;
}
}
}
int main()
{
int i, n, a, tip;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>tip;
if(tip==1)
{
cin>>a;
adauga(a);
}
if(tip==2)
{
cin>>a;
sterge(poz[a]);
}
if(tip==3)
cout<<v[heap[1]]<<'\n';
}
}