Pagini recente » Cod sursa (job #2657920) | Cod sursa (job #1605248) | Cod sursa (job #209806) | Cod sursa (job #2667959) | Cod sursa (job #1022413)
#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 && a[h[p]]<a[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 && a[h[fs]] < a[h[bun]]) bun = fs;
if(fd <= nh && a[h[fd]] < a[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",a[h[1]]);
continue;
}
fscanf(in,"%d",&x);
if(i == 5)
i=5;
if(cod == 1)
{
l++; nh++;
a[l] = x;
h[nh] = l;
pos[l] = nh;
urca(nh);
}
if(i == 6)
i=6;
if(cod == 2)
{
pos[h[nh]]=pos[h[x]];
//schimb(pos[a[x]],nh--);
//urca(pos[a[x]]);
//coboara(pos[a[x]]);
schimb(pos[x] , nh--);
urca(pos[x]);
coboara(pos[x]);
}
}
return 0;
}