Pagini recente » Cod sursa (job #1175131) | Cod sursa (job #1176320) | Cod sursa (job #888532) | Cod sursa (job #2794530) | Cod sursa (job #1755552)
#include <iostream>
using namespace std;
int a[200001],x,lnod=1,order=1,n,index[200001],index2[200001];
void swap(int i,int j){int temp=a[j];a[j]=a[i];a[i]=temp;}
void swapIndex(int i,int j){int temp=index[j];index[j]=index[i];index[i]=temp;}
void swapIndex2(int i,int j){int temp=index2[j];index2[j]=index2[i];index2[i]=temp;}
void insert(){
int nod=lnod;
while(nod!=1&&a[nod/2]>a[nod]){
swap(nod/2,nod);
swapIndex(index2[nod/2],index2[nod]);
swapIndex2(nod/2,nod);
nod=nod/2;
}
lnod++;
}
void deleteIndex(int x){
int nod=index[x];
while(2*nod<lnod){
//cout<<lnod<<" "<<nod<<endl;
int nod2=a[2*nod]>a[2*nod+1]?2*nod+1:2*nod;
if(2*nod+1==lnod)nod2=2*nod;
swap(nod,nod2);
index2[nod2]=nod;
nod=nod2;
}
lnod--;
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
switch(x){
case 1:scanf("%d",&x);
index[order]=lnod;
index2[lnod]=order++;
a[lnod]=x;
insert();
break;
case 2:scanf("%d",&x);deleteIndex(x);break;
case 3:printf("%d\n",a[1]);
}
}
}