Pagini recente » Cod sursa (job #1653202) | Cod sursa (job #1737093) | Cod sursa (job #329915) | Cod sursa (job #1790268) | Cod sursa (job #2565734)
#include <bits/stdc++.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int hp[200003];
int pozhp[200003];///pozhp[i]=x inseamna ca nr citit al i-lea este pe poz x in heap
int pozcit[200003];///pozcit[x]=i inseamna ca nr de pe poz x in heap a fost citit al i-lea
int n,i;
int lv,nrcit=0;
void pb1()
{
int nr;nrcit++;
f>>nr;
lv++;
pozhp[nrcit]=lv;
pozcit[lv]=nrcit;
hp[lv]=nr;
int poz=lv;
while(poz/2>0 && hp[poz]<hp[poz/2])
{
swap(hp[poz],hp[poz/2]);
swap(pozhp[pozcit[poz]],pozhp[pozcit[poz/2]]);
swap(pozcit[poz],pozcit[poz/2]);
poz=poz/2;
}
}
void pb2()
{
int nr;
f>>nr;
///trb sa elimin nr de pe pozitia nr in citit din heap
int poz=pozhp[nr];///aceasta e pozitia din heap
swap(hp[lv],hp[poz]);
swap(pozhp[pozcit[poz]],pozhp[pozcit[lv]]);
swap(pozcit[poz],pozcit[lv]);
lv--;
while(poz*2<=lv)
{
if((hp[poz]<hp[2*poz] || 2*poz>lv) && (hp[poz]<hp[2*poz+1] || 2*poz+1>lv))break;
int pozsch;
if(hp[2*poz]<hp[2*poz+1])pozsch=2*poz;
else if(2*poz+1<=lv)pozsch=2*poz+1;
else pozsch=2*poz;
swap(hp[poz],hp[pozsch]);
swap(pozhp[pozcit[poz]],pozhp[pozcit[pozsch]]);
swap(pozcit[poz],pozcit[pozsch]);
poz=pozsch;
}
while(poz/2>0 && hp[poz]<hp[poz/2])
{
swap(hp[poz],hp[poz/2]);
swap(pozhp[pozcit[poz]],pozhp[pozcit[poz/2]]);
swap(pozcit[poz],pozcit[poz/2]);
poz=poz/2;
}
}
int main()
{
f>>n;
for(i=1;i<=n;i++)
{
int pb;
f>>pb;
if(pb==1)
{
pb1();
}
else if(pb==2)
{
pb2();
}
else
g<<hp[1]<<'\n';
}
}