Pagini recente » Cod sursa (job #1335188) | Cod sursa (job #1272295) | Cod sursa (job #2242943) | Cod sursa (job #844320) | Cod sursa (job #2617746)
#include<fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,i,op,x,poz[200001],s;
struct elem
{
int val,ord;
};
elem h[200001];
void afisare()
{
for(int j=1;j<=s;j++)
fout<<h[j].val<<" ";
fout<<"\n";
}
int main()
{
fin>>n;
int nr=0;
for(i=1; i<=n; i++)
{
int p;
fin>>op;
if(op==1)
{
fin>>x;
nr++;
s++;
h[s].val=x;
h[s].ord=nr;
poz[nr]=s;
p=s;
while(p>1&&h[p].val<h[p/2].val)
{
swap(h[p],h[p/2]);
swap(poz[h[p].ord],poz[h[p/2].ord]);
p/=2;
}
}
else if(op==2)
{
fin>>x;
int k=poz[x];
swap(h[s],h[k]);
swap(poz[h[s].ord],poz[h[k].ord]);
h[s]={0,0};
s--;
if(k==s+1)
continue;
p=k;
while(p>1&&h[p].val<h[p/2].val)
{
swap(h[p],h[p/2]);
swap(poz[h[p].ord],poz[h[p/2].ord]);
p/=2;
}
while(p<=s)
{
int pmin1=0,pmin2=0,cf;
if(p*2+1<=s)
if(h[p*2+1].val<h[p].val)
pmin1=p*2+1;
if(p*2<=s)
if(h[p*2].val<h[p].val)
pmin2=p*2;
if(pmin1==0&&pmin2==0)
break;
else if(pmin1==0)
p=pmin2;
else if(pmin2==0)
p=pmin1;
else
{
if(h[pmin1].val<h[pmin2].val)
cf=pmin1;
else cf=pmin2;
p=cf;
}
swap(h[p],h[p/2]);
swap(poz[h[p].ord],poz[h[p/2].ord]);
}
}
else fout<<h[1].val<<"\n";
//afisare();
}
}