Pagini recente » Cod sursa (job #1092368) | Cod sursa (job #1242582) | Cod sursa (job #403521) | Cod sursa (job #1076006) | Cod sursa (job #769107)
Cod sursa(job #769107)
#include<fstream>
using namespace std;
const int NM = 200005;
int v[NM],h[NM],poz[NM],hp,n;
inline void swap(int &a,int &b){ int k=a; a=b; b=k; }
void upheap(int k){
while(k>1 && v[h[k]]<v[h[k/2]])
{
swap(poz[h[k]],poz[h[k/2]]);
swap(h[k],h[k/2]);
k/=2;
}
}
void downheap(int k){
int nod=1;
while(nod)
{
nod=0;
if(2*k<=hp)
{
nod=2*k;
if(2*k+1<=hp && v[h[nod]]>v[h[nod+1]])++nod;
if(v[h[nod]]>=v[h[k]]) nod=0;
}
if(nod)
{
swap(poz[h[nod]],poz[h[k]]);
swap(h[nod],h[k]);
k=nod;
}
}
}
void insert(int k){
v[++n]=k; h[++hp]=n; poz[n]=hp;
upheap(hp);
}
void del(int k){
poz[h[hp]]=k; swap(h[k],h[hp]); --hp;
if(k>1 && v[h[k]]<v[h[k/2]])upheap(k);
else downheap(k);
}
int main(void){
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int i,M,op,x;
for(i=1,fin>>M;i<=M;++i)
{
fin>>op;
if(op==1){ fin>>x; insert(x); }
if(op==2){ fin>>x; del(poz[x]); }
if(op==3)fout<<v[h[1]]<<'\n';
}
return 0;
}