Pagini recente » Cod sursa (job #107942) | Cod sursa (job #1132183) | Cod sursa (job #1041551) | Cod sursa (job #1835672) | Cod sursa (job #2724769)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,m,poz[200001],op,x,y;
struct nod
{
int val,nr_ord;
}v[200001];
void adaug(int k)
{
while(k>1&&v[k].val<v[k/2].val)
{
swap(v[k],v[k/2]);
swap(poz[v[k].nr_ord],poz[v[k/2].nr_ord]);
k/=2;
}
}
void sterg(int k)
{
while(2*k<=m)
{
int fiumax=2*k;
if(2*k+1<=m&&v[2*k].val>v[2*k+1].val)
{
fiumax=2*k+1;
}
if(v[k].val>v[fiumax].val)
{
swap(v[k],v[fiumax]);
swap(poz[v[k].nr_ord],poz[v[fiumax].nr_ord]);
k=fiumax;
}
else
break;
}
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>op;
if(op==1)
{
fin>>x;
v[++m].val=x;
v[m].nr_ord=++y;
poz[y]=m;
adaug(m);
}
else
if(op==2)
{
fin>>x;
v[poz[x]].val=v[m].val;
poz[v[m].nr_ord]=poz[x];
m--;
sterg(poz[x]);
adaug(poz[x]);
}
else
fout<<v[1].val<<"\n";
}
return 0;
}