Pagini recente » Cod sursa (job #3235467) | Cod sursa (job #2257818) | Cod sursa (job #2609467) | Cod sursa (job #2867793) | Cod sursa (job #1022395)
#include <cstdio>
using namespace std;
FILE *in,*out;
const int N = 200004 ;
int pos[N],h[N],a[N],nh;
void schimb(int a , int b){
int aux;
aux = h[a];
h[a]=h[b];
h[b]=aux;
}
void urca(int p){
while(p>1 && h[p]<h[p/2]){
schimb(p,p/2);
pos[h[p]]=p;
pos[h[p/2]]=p/2;
p/=2;
}
}
void coboara(int p){
int fs=2*p,fd=2*p+1,bun=p;
if(fs <= nh && h[fs] < h[bun]) bun = fs;
if(fd <= nh && h[fd] < h[bun]) bun = fd;
if(bun != p){
schimb(p,bun);
pos[h[bun]]=bun;
pos[h[p]]=p;
coboara(bun);
}
}
int main(){
in = fopen("heapuri.in","r");
out = fopen("heapuri.out","w");
int n,i,cod,x,l;
l=0;
nh=0;
fscanf(in,"%d",&n);
for(int i=1;i<=n;i++)
{
fscanf(in,"%d",&cod);
if(cod == 3)
{
fprintf(out,"%d\n",h[1]);
continue;
}
fscanf(in,"%d",&x);
if(cod == 1)
{
l++; nh++;
a[l] = x;
h[nh] = x;
pos[x] = nh;
urca(nh);
}
if(i == 6)
i=6;
if(cod == 2)
{
pos[h[nh]]=pos[a[x]];
schimb(pos[a[x]],nh--);
urca(pos[a[x]]);
coboara(pos[a[x]]);
}
}
return 0;
}