Cod sursa(job #1812892)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 22 noiembrie 2016 15:30:01
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.3 kb
#include <stdio.h>
#define MAXN 200010
int k = 0, poz[MAXN];      //poz[i] ---> pozitia pe care se afla elementul adaugat al i-lea


    struct heap{
    int val,pozi;
    };
struct heap my_heap[MAXN];
                            //my_heap[i].val ----> valoarea elementului i
                            //my_heap[i].pozi ----> al catelea element a fost adaugat
void heapUp(int k){

    int i = k;
    struct heap aux;

    while(my_heap[i].val < my_heap[i / 2].val && i > 1){
        poz[my_heap[i].pozi] = i / 2;
        poz[my_heap[i / 2].pozi] = i;

        aux = my_heap[i];
        my_heap[i] = my_heap[i / 2];
        my_heap[i / 2] = aux;
        i = i / 2;
    }
}

void heapDown(int x){

    int i = x;
    struct heap aux;

    while((my_heap[i].val > my_heap[i * 2].val && i * 2 <= k) || (my_heap[i].val > my_heap[i * 2 + 1].val && (i * 2 + 1) <= k)){
            if(my_heap[2 * i].val > my_heap[2 * i + 1].val && 2 * i + 1 <= k){
                poz[my_heap[i].pozi] = 2 * i + 1;
                poz[my_heap[i * 2 + 1].pozi] = i;

                aux = my_heap[2 * i + 1];
                my_heap[2 * i + 1] = my_heap[i];
                my_heap[i] = aux;
                i = i * 2 + 1;
            }
            else{
                poz[my_heap[i].pozi] = 2 * i;
                poz[my_heap[i * 2].pozi] = i;

                aux = my_heap[2 * i];
                my_heap[2 * i] = my_heap[i];
                my_heap[i] = aux;
                i = i * 2;
            }
    }
}

int main(){

    FILE *f, *g;
    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");

    int i, n, mod, x, count = 0;

    fscanf(f,"%d",&n);

    for(i = 1;i <= n; ++i){
        fscanf(f,"%d",&mod);

        if(mod == 1){
            fscanf(f,"%d",&x);
            ++k;
            ++count;
            my_heap[k].val = x;
            my_heap[k].pozi = count;
            poz[count] = k;
            heapUp(k);
        }
        if(mod == 2){
            fscanf(f,"%d",&x);
            my_heap[poz[x]].val = my_heap[k].val;
            my_heap[poz[x]].pozi = my_heap[k].pozi;
            poz[my_heap[k].pozi] = poz[x];
            --k;
            heapDown(poz[x]);
        }

        if(mod == 3)
            fprintf(g,"%d\n",my_heap[1].val);
    }
    return 0;
}