Pagini recente » Cod sursa (job #927688) | Cod sursa (job #1151955) | Cod sursa (job #57691) | Cod sursa (job #388293) | Cod sursa (job #2111248)
#include <fstream>
#define MAX 200005
using namespace std;
ifstream fi("heapuri.in");
ofstream fo("heapuri.out");
/// poz[i]=pozitia in heap a celui de-al i-lea nr.
/// ord[i]=al catulea nr. e al i-lea din heap
int H[2*MAX],poz[MAX],ord[MAX];
int q,n,nr;
void urca(int x) /// urcam elementul de pe pozitia x
{
if (x==1)
return;
if (H[x]>=H[x/2]) /// >= parinte, e ok
return;
/// il schimbam cu parintele
swap(H[x],H[x/2]);
swap(poz[ord[x]],poz[ord[x/2]]);
swap(ord[x],ord[x/2]);
urca(x/2); /// urcam parintele
}
void coboara(int x) /// coboram elementul de pe pozitia x
{
int son=0;
if (2*x<=n) /// are copil stang
{
son=2*x;
if (2*x+1<=n && H[2*x+1]<H[2*x])
son=2*x+1;
if (H[son]>=H[x])
son=0;
}
if (son)
{
swap(H[x],H[son]);
swap(poz[ord[x]],poz[ord[son]]);
swap(ord[x],ord[son]);
coboara(son);
}
}
void inserare(int x) /// adaugam elementul x
{
n++,nr++;
poz[nr]=n;
ord[n]=nr;
H[n]=x;
urca(n);
}
void stergere(int x) /// stergem al x-lea intrat
{
int key=poz[x];
swap(H[key],H[n]);
n--;
if (key>1 && H[key]<H[key/2]) /// < parinte, urcam
urca(key);
else
coboara(key);
}
int main()
{
fi>>q;
while (q--)
{
int c,x;
fi>>c;
if (c!=3)
fi>>x;
if (c==3)
fo<<H[1]<<"\n";
else if (c==1) /// inserare
{
inserare(x);
}
else /// stergere
{
stergere(x);
}
}
return 0;
}