Cod sursa(job #1022416)

Utilizator PavelPavel Ana-Oriana Pavel Data 5 noiembrie 2013 13:20:06
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>

using namespace std;

FILE *in,*out;

const int N = 200004 ;

int pos[N],h[N],a[N],nh;

void schimb(int a , int b){
    int aux;
    aux = h[a];
    h[a]=h[b];
    h[b]=aux;
}

void urca(int p){
    while(p>1 && a[h[p]]<a[h[p/2]]){
        schimb(p,p/2);
        pos[h[p]]=p;
        pos[h[p/2]]=p/2;
        p/=2;
    }
}

void coboara(int p){
    int fs=2*p,fd=2*p+1,bun=p;
    if(fs <= nh && a[h[fs]] < a[h[bun]]) bun = fs;
    if(fd <= nh && a[h[fd]] < a[h[bun]]) bun = fd;
    if(bun != p){
        schimb(p,bun);
        pos[h[bun]]=bun;
        pos[h[p]]=p;
        coboara(bun);
    }
}

int main(){
    in = fopen("heapuri.in","r");
    out = fopen("heapuri.out","w");
    int n,i,cod,x,l;
    l=0;
    nh=0;
    fscanf(in,"%d",&n);
    for(int i=1;i<=n;i++)
    {
        fscanf(in,"%d",&cod);
        if(cod == 3)
        {
            fprintf(out,"%d\n",a[h[1]]);
            continue;
        }
        fscanf(in,"%d",&x);
        if(i == 5)
            i=5;
        if(cod == 1)
        {
            l++; nh++;
            a[l] = x;
            h[nh] = l;
            pos[l] = nh;
            urca(nh);
        }
        if(i == 6)
            i=6;
        if(cod == 2)
        {
            pos[h[nh]]=pos[x];
            //schimb(pos[a[x]],nh--);
            //urca(pos[a[x]]);
            //coboara(pos[a[x]]);
            schimb(pos[x] , nh--);
            urca(pos[x]);
            coboara(pos[x]);
        }
    }
    return 0;
}