Pagini recente » Cod sursa (job #1785118) | Cod sursa (job #1991275) | Cod sursa (job #1398916) | Cod sursa (job #1152165) | Cod sursa (job #398169)
Cod sursa(job #398169)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define M 200010
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
struct {
int val,ordine;
} h[M];
int n,nrop,ord[M];
void sift(int n,int k){
int fiu,c;
do{
c=k<<1;
fiu=0;
if(c<=n){
fiu=c;
if(c+1<=n && h[fiu].val>=h[c+1].val){
fiu=c+1;
}
if(h[fiu].val>=h[k].val){
fiu=0;
}
}
if(fiu){
swap(h[fiu].val,h[k].val);
swap(h[fiu].ordine,h[k].ordine);
// aici ordine
swap(ord[h[c].ordine],ord[h[k].ordine]);
k=fiu;
}
}while(fiu);
}
void percolate(int n,int k){
while(k>1 && h[k/2].val>h[k].val){
swap(h[k/2].val,h[k].val);
swap(h[k/2].ordine,h[k].ordine);
// aici ordine
swap(ord[h[k/2].ordine],ord[h[k].ordine]);
k/=2;
}
}
int main(){
int x,tip,i,ordin=0,aux,aux2;
fscanf(f,"%d",&nrop);
for(i=1;i<=nrop;i++){
fscanf(f,"%d",&tip);
if(tip==1){
fscanf(f,"%d",&x);
h[++n].val=x;
ordin++;
h[n].ordine=ordin;
ord[n]=n;
percolate(n,n);
}
else if(tip==2){
fscanf(f,"%d",&x);
//aux=ord[h[ord[x]].ordine];
swap(h[ord[x]].val,h[n].val);
//aux=ord[h[ord[n]].ordine];
//aux2=ord[h[ord[x]].ordine];
swap(h[ord[x]].ordine,h[n].ordine);
//swap(ord[h[n].ordine],ord[ord[x]]);
swap(ord[h[n].ordine],ord[h[ord[x]].ordine]);
//swap(ord[aux],ord[aux2]);
h[n].val=0;
//ord[n]=0;
n--;
sift(n,1);
}
else {
fprintf(g,"%d\n",h[1]);
}
}
fclose(f);
fclose(g);
return 0;
}