Pagini recente » Cod sursa (job #548993) | Cod sursa (job #90447) | Cod sursa (job #261429) | Cod sursa (job #3189460) | Cod sursa (job #2947919)
#include <stdio.h>
#define MAXN 200000
#define MAXVAL 1000000001
static inline int parent(int x){
return (x-1) / 2;
}
static inline int lchild(int x){
return x * 2 + 1;
}
static inline int rchild(int x){
return x * 2 + 2;
}
int v[MAXN], o[MAXN], vi, oi, opos[MAXN];
void swap(int *a, int *b){
int aux = *a;
*a = *b;
*b = aux;
}
void vectorSwap(int a, int b){
swap(&v[a], &v[b]);
swap(&o[a], &o[b]);
swap(&opos[o[a]], &opos[o[b]]);
}
int min(int a, int b){
if(a < b)
return a;
return b;
}
void upHeap(int x){
// Urcam cat timp elementul este mai mic decat parintele
while(v[x] < v[parent(x)]){
vectorSwap(x, parent(x));
x = parent(x);
}
}
void downHeap(int x){
int minp;
// Coboram cat timp nu am iesit din heap, si elementul este mai mare decat vreunul dintre copii sai
while(x < vi && v[x] > min(v[lchild(x)], v[rchild(x)])){
if(v[lchild(x)] < v[rchild(x)])
minp = lchild(x);
else
minp = rchild(x);
vectorSwap(x, minp);
x = minp;
}
}
void removeElement(int x){
vi --;
vectorSwap(x, vi);
v[vi] = MAXVAL;
downHeap(x);
}
int main(){
int n, i, j, a, x;
FILE *fin, *fout;
fin = fopen("heapuri.in", "r");
fout = fopen("heapuri.out", "w");
for(i = 0; i < MAXN; i ++)
v[i] = MAXVAL;
fscanf(fin, "%d", &n);
vi = 0;
oi = 0;
for(i = 0; i < n; i ++){
fscanf(fin, "%d", &a);
if(a == 1){ // Se adauga elementul x
fscanf(fin, "%d", &x);
v[vi] = x;
o[vi] = oi;
opos[oi] = vi;
vi ++;
oi ++;
upHeap(vi - 1);
} else if(a == 2){ // Se sterge al x-lea element adaugat
fscanf(fin, "%d", &x);
x --;
// j = 0;
// while(o[j] != x)
// j ++;
removeElement(opos[x]);
// printf("! %d ! ", j);
} else{ // Se afiseaza minimul
fprintf(fout, "%d\n", v[0]);
}
// for(int ii = 0; ii < vi; ii ++){
// printf("%d - %d ", v[ii], o[ii]);
// }
// printf("\n");
// for(int ii = 0; ii < oi; ii ++){
// printf("%d ", opos[ii]);
// }
// printf("\n\n");
}
fclose(fin);
fclose(fout);
return 0;
}