Pagini recente » Cod sursa (job #1795155) | Cod sursa (job #235659) | Cod sursa (job #772755) | Cod sursa (job #536504) | Cod sursa (job #315164)
Cod sursa(job #315164)
#include<algorithm>
using namespace std;
#define DIM 200001
struct hp{
int val,poz;};
int n,m,cnt,h[DIM];
hp a[DIM];
void swap(int x,int y){
int aux;
aux=h[x];
h[x]=h[y];
h[y]=aux;}
void uph(int k){
int aux;
while(k>1){
aux=k>>1;
if(a[h[k]].val<a[h[aux]].val){
a[h[k]].poz=aux;
a[h[aux]].poz=k;
swap(k,aux);
k=aux;}
else
return;}}
void downh(int k){
int aux;
while(k<=n){
aux=k;
if(k<<1<=n){
aux=k<<1;
if(aux+1<=n&&a[h[aux+1]].val<a[h[aux]].val)
++aux;}
else
return;
if(a[h[aux]].val<a[h[k]].val){
a[h[aux]].poz=k;
a[h[k]].poz=aux;
swap(k,aux);
k=aux;}
else
return;}}
void insert(int val){
h[++n]=cnt;
a[h[n]].poz=n;
a[h[n]].val=val;
uph(n);}
void cut(int k){
h[k]=h[n--];
a[h[k]].poz=k;
if(k>1&&a[h[k]].val<a[h[k>>1]].val)
uph(k);
else
downh(k);}
void solve(){
int i,poz,tip,val;
scanf("%d",&m);
for(i=0; i<m; ++i){
scanf("%d",&tip);
if(tip==1){
scanf("%d",&val);
++cnt;
insert(val);}
else if(tip==2){
scanf("%d",&poz);
cut(a[poz].poz);}
else
printf("%d\n",a[h[1]].val);}}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
solve();
return 0;}