Cod sursa(job #1809542)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 19 noiembrie 2016 00:28:13
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.43 kb
#include <stdio.h>
#define MAXN 210000
int n = 0,poz[210000];

    struct hi{
    int val,pozi;};
struct hi heap[MAXN];

void add(int x){

    int i, j;
    struct hi aux;
    ++n;
    heap[n].val = x;
    heap[n].pozi = n;
    poz[n] = n;
    i = n;

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

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

void del(int x){

    heap[poz[x]] = heap[n];
    --n;
    int aux, i = poz[x];
    while(i > 1 && heap[i].val < heap[i / 2].val){
        poz[heap[i].pozi] = i / 2;
        poz[heap[i / 2].pozi] = i;

        aux = heap[i].val;
        heap[i].val = heap[i / 2].val;
        heap[i / 2].val = aux;
        i = i / 2;
    }

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

                aux = heap[2 * i].val;
                heap[2 * i].val = heap[i].val;
                heap[i].val = aux;
                i = i * 2;
            }
            else{if(i * 2 + 1 <= n){
                poz[heap[i].pozi] = 2 * i;
                poz[heap[i * 2 + 1].pozi] = i;

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

                aux = heap[2 * i].val;
                heap[2 * i].val = heap[i].val;
                heap[i].val = aux;
                i = i * 2;
            }
        }
}

int min(){
    return heap[1].val;
}

int main(){

    FILE *f,*g;
    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");
    int i, n, x, y;
    fscanf(f,"%d",&n);

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

        if(x == 1){
            fscanf(f,"%d",&y);
            add(y);
        }
        if(x == 2){
            fscanf(f,"%d",&y);
            del(y);
        }
        if(x == 3){
            y = min();
            fprintf(g,"%d\n",y);
        }
    }
    return 0;
}