Pagini recente » Cod sursa (job #2828232) | Cod sursa (job #582247) | Cod sursa (job #1749275) | Cod sursa (job #1679888) | Cod sursa (job #303075)
Cod sursa(job #303075)
#include <stdio.h>
#define MAXN 200005
FILE * fin = fopen("heapuri.in", "r");
FILE * fout= fopen("heapuri.out","w");
long long v[MAXN], poz[MAXN], n, N;
long long cauta(long long x){
for(int i=1;i<=N;++i)
if(poz[i] == x) return i;
return 0;
}
void adauga_in_heap(long long x){
long long i,j,aux,x1,x2;
v[++N] = x;
poz[N] = N;
i = N;
while(i > 1)
if(v[i] <= v[i/2]){
aux = v[i]; v[i] = v[i/2]; v[i/2] = aux;
x1 = cauta(i);
x2 = cauta(i/2);
aux = poz[x1]; poz[x1] = poz[x2]; poz[x2] = aux;
i/=2;}
else i = 1;
}
void extract(long long idx){
long long i,j,aux,x1,x2;
v[poz[idx]] = v[N];
N--;i = 1;
while(i<=N)
if(2*i <= N){
j = 2*i;
if(j+1<=N && v[j+1] <= v[j])j++;
if(v[i] >= v[j]){
aux = v[i]; v[i] = v[j]; v[j] = aux;
x1 = cauta(i);
x2 = cauta(i/2);
aux = poz[x1]; poz[x1] = poz[x2]; poz[x2] = aux;
i = j;
} else i = n+1;
} else i = n+1;
}
int main(){
long long val, op;
fscanf(fin, "%lld", &n);
for(int i = 1;i<=n;++i){
fscanf(fin,"%lld", &op);
if(op < 3){
fscanf(fin,"%lld", &val);
if(op == 1) adauga_in_heap(val);
if(op == 2) extract(val);
} else
fprintf(fout, "%lld\n", v[1]);
}
return 0;
}