Pagini recente » Cod sursa (job #1100704) | Cod sursa (job #2122360) | Cod sursa (job #675382) | Cod sursa (job #1813264) | Cod sursa (job #331754)
Cod sursa(job #331754)
#include <stdio.h>
#define N 200010
int n,m,h[N],poz[N],v[N];
void swap(int &x,int &y){
int z=x;x=y;y=z;
}
void sift(int k){
int son;
do{
son=0;
if(2*k<=n) son=2*k;
if(2*k+1<=n && v[h[2*k+1]]<v[h[son]]) son=2*k+1;
if(son && v[h[son]]<v[h[k]]){
poz[h[son]]=k;
poz[h[k]]=son;
swap(h[k],h[son]);
k=son;
}
else son=0;
}
while(son);
}
void percolate(int k){
while(k>1 && v[h[k/2]]>v[h[k]]){
poz[h[k]]=k/2;
poz[h[k/2]]=k;
swap(h[k],h[k/2]);
k/=2;
}
}
void add(){
h[++n]=v[0];
poz[v[0]]=n;
percolate(n);
}
void cut(int x){
swap(h[n],h[poz[x]]);
poz[x]=poz[h[n]];
n--;
if(poz[x]>1 && v[h[poz[x]]]<v[h[poz[x]/2]]) percolate(poz[x]);
else sift(poz[x]);
}
int main(){
int i,x,y;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d",&x);
if(x!=3){
scanf("%d",&y);
if(x==1) v[++v[0]]=y,add();
else
cut(y);
}
else printf("%d\n",v[h[1]]);
}
return 0;
}