Pagini recente » Cod sursa (job #934527) | Cod sursa (job #2259584) | Cod sursa (job #2915389) | Cod sursa (job #1919510) | Cod sursa (job #1053981)
#include <fstream>
#define Size 2000000
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int H[Size+1], ord[Size+1], poz[Size+1], n=0, cnt=0;
void urca(int pp)
{
while(pp>1 && H[ord[pp]]<H[ord[pp/2]])
{
swap(ord[pp], ord[pp/2]);
swap(poz[ord[pp]], poz[ord[pp/2]]);
pp=pp/2;
}
}
void coboara(int pp)
{
int pp2;
while(pp*2+1<=n &&(H[ord[pp]]>H[ord[pp*2]] || H[ord[pp]]>H[ord[pp*2+1]]))
{
pp2=pp*2;
if(H[ord[pp2]]>H[ord[pp2+1]])
pp2++;
swap(ord[pp2], ord[pp]);
poz[ord[pp2]]=pp2;
poz[ord[pp]]=pp;
pp=pp2;
}
if(pp*2==n && H[ord[pp]]>H[ord[pp*2]])
{
swap(ord[pp], ord[pp*2]);
swap(poz[ord[pp]], poz[ord[pp*2]]);
}
}
void inserare()
{
int x;
f>>x;
n++;
cnt++;
H[cnt]=x;
ord[n]=cnt;
poz[cnt]=n;
urca(n);
}
void stergere()
{
int x;
f>>x;
ord[poz[x]]=ord[n];
n--;
urca(poz[x]);
coboara(poz[x]);
}
int main()
{
int N, cod, i, j;
f>>N;
for(i=0; i<N; i++)
{
f>>cod;
switch(cod)
{
case 1:{inserare(); break;}
case 2:{stergere(); break;}
case 3:{g<<H[ord[1]]<<'\n'; break;}
}
}
f.close();
g.close();
return 0;
}