Pagini recente » Statistici Borsan Silviu (silviu982001) | Istoria paginii utilizator/consti.001 | Cod sursa (job #2701814) | Cod sursa (job #444784) | Cod sursa (job #240068)
Cod sursa(job #240068)
#include<cstdio>
long h[200000],nr,n,l,x,y,a[200000],i;
long caut(long x){
long i;
for(i=0;i<n;i++)
if(h[i]==x)return i;
return -1;
}
void swap(long i, long j){
long x;
x=h[i];
h[i]=h[j];
h[j]=x;
}
void heapup(long k){
long t;
if(k<=0)return;
t=(k-1)/2;
if(h[k]<h[t]){
swap(k,t);
heapup(t);
}
}
void heapdw(long k, long n){
int st,dr,min;
if(2*k+1<n){
st=h[2*k+1];
if(2*k+2<n)dr=h[2*k+1];
else dr=st+1;
if(st<dr)min=2*k+1;
else min=2*k+2;
if(h[k]>h[min]){
swap(k,min);
heapdw(min,n);
}
}
}
void cut(long x){
long k,t;
k=caut(x);
h[k]=h[l-1];
l--;
t=(k-1)/2;
if(h[k]<h[t])heapup(k);
else heapdw(k,l);
}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%ld",&n);
l=nr=0;
for(i=0;i<n;i++){
scanf("%ld",&x);
if(x==3)printf("%ld\n",h[0]);
else{
scanf("%ld",&y);
if(x==1){
a[nr++]=y;
h[l]=y;
heapup(l);
l++;
}
else
cut(a[y-1]);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}