Pagini recente » Cod sursa (job #1024145) | Cod sursa (job #1389354) | Cod sursa (job #18993) | Cod sursa (job #2193127) | Cod sursa (job #1319405)
#include <iostream>
#include <fstream>
using namespace std;
#define maxn 500000
int valc=0, hc=0;
int h[maxn], poz[maxn], val[maxn];
int getmin(int n)
{
if (h[2*n+1] && h[2*n])
if (val[h[2*n]]>val[h[2*n+1]]) return 2*n+1;
else return 2*n;
if (h[2*n]) return 2*n;
return 0;
}
void up(int n)
{
while (val[h[n/2]]>val[h[n]] && n>1)
{
swap(h[n/2], h[n]);
swap(poz[h[n/2]], poz[h[n]]);
n=n/2;
}
}
void down(int n)
{
int m=getmin(n);
while (m)
{
if (val[h[n]]>val[h[m]])
{
swap(h[n], h[m]);
swap(poz[h[n]], poz[h[m]]);
n=m;
m=getmin(n);
}
else return;
}
//swap(poz[h[n]], poz[h[m]]);
//poz[h[m]]=m;
}
void take(int n)
{
h[n]=h[hc];
h[hc]=0;
hc--;
if ((n>1) && val[h[n]]<val[h[n/2]])
up(n);
else down(n);
//poz[h[n]]=0;
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, op, x, i, j;
f>>n;
for (i=1;i<=n;i++)
{
f>>op;
if (op==3) g<<val[h[1]]<<'\n';
else
{
f>>x;
if (op==2) take(poz[x]);
if (op==1)
{
hc++; valc++;
h[hc]=valc; val[valc]=x;
poz[hc]=hc;
up(hc);
}
}
}
}