Pagini recente » Cod sursa (job #746151) | Cod sursa (job #2490055) | Cod sursa (job #1815939) | Cod sursa (job #827559) | Cod sursa (job #1538170)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
int n, q=0, x, lh=0;
int poz_heap[200002],poz_vec[200002];
typedef int Heap[200002];
Heap H;
int tata(int xx)
{return xx/2;}
int fiu_stg(int xx)
{return xx*2;}
int fiu_dr(int xx)
{return xx*2+1;}
void Interschimba(int a, int b)
{
int s=poz_vec[a];
int t=poz_vec[b];
int aux;
aux=H[b];
H[b]=H[a];
H[a]=aux;
poz_vec[b] = s;
poz_heap[s] = b;
poz_vec[a] = t;
poz_heap[t] = a;
}
void coboara(int k)
{
int fiu, ok=1;
while(fiu_stg(k)<=lh && ok)
{
fiu=fiu_stg(k);
if(fiu_dr(k)<=lh && H[fiu_dr(k)]<H[fiu_stg(k)])
fiu=fiu_dr(k);
if(H[k]>H[fiu])
{
Interschimba(k,fiu);
k=fiu;
}
else
ok=0;
}
}
void urca(int k)
{
while (k>1 && H[k]<H[tata(k)])
{
Interschimba(k,tata(k));
k=tata(k);
}
}
void elimina(Heap H, int k)
{
Interschimba(k,lh);
lh--;
if (k>1 && H[k]<H[tata(k)])
urca(k);
else
coboara(k);
}
void insereaza(int e)
{
lh++;
H[lh]=e;
poz_heap[q]=lh;
poz_vec[lh]=q;
urca(lh);
}
int main()
{
in>>n;
int i, l=0,cerinta;
for(i=0; i<n; i++)
{
in>>cerinta;
if(cerinta==1)
{
in>>x;
q++;
insereaza(x);
}
else
if(cerinta==2)
{
in>>x;
elimina(H,poz_heap[x]);
}
else
if(cerinta==3)
out<<H[1]<<'\n';
}
in.close();
out.close();
return 0;
}