Pagini recente » Cod sursa (job #2001171) | Cod sursa (job #152225) | Monitorul de evaluare | Cod sursa (job #1941666) | Cod sursa (job #1395853)
#include <cstdio>
#include<fstream>
#define tata(x) x/2
#define fiust(x) x*2
#define fiudr(x) x*2+1
using namespace std;
int a[200001], h[200001], poz[200001], n=0, m=0;
void swap (int x, int y)
{
poz[h[x]]=y;
poz[h[y]]=x;
int aux=h[x];
h[x]=h[y];
h[y]=aux;
}
void heapup (int x)
{
if (x==1) return;
if (a[h[tata(x)]]>a[h[x]])
{
swap(x,tata(x));
heapup(tata(x));
}
}
void heapdown (int x)
{
int valst=-1, valdr=-1, p;
if (fiust(x)>n) return;
valst=a[h[fiust(x)]];
if (fiudr(x)<=n) valdr=a[h[fiudr(x)]];
else valdr=valst+1;
if (valst<=valdr) p=fiust(x);
else p=fiudr(x);
if(a[h[tata(p)]]>a[h[p]])
{
swap(p,tata(p));
heapdown(p);
}
}
int main()
{
int t, i, p, k, x, y;
ifstream fin("heapuri.in");
fstream fout("heapuri.out");
fin>>t;
for (i=1; i<=t; i++)
{
fin>>p;
if (p==1)
{
fin>>x;
a[++m]=x;
h[++n]=m;
poz[m]=n;
heapup(n);
}
else if (p==2)
{
fin>>k;
y=poz[k];
swap(poz[k],n);
n--;
heapdown(y);
}
else
{
fout<<a[h[1]]<<"\n";
}
}
return 0;
}