Cod sursa(job #1793645)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 31 octombrie 2016 12:15:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#define MAXN 200000
int poz[MAXN+1], h[MAXN+1], v[MAXN+1];

inline void swap(int p1, int p2){
    int e1=h[p1], e2=h[p2];
    poz[e1]=p2;
    poz[e2]=p1;
    h[p1]=e2;
    h[p2]=e1;
}
inline void urca(int poz){
    while(poz>1 && v[h[poz]]<v[h[poz/2]]){
        swap(poz,poz/2);
        poz/=2;
    }
}

void coboara(int p, int n){
    int fs=2*p, fd=2*p+1, bun=p;
    if(fs<n && v[h[fs]]<v[h[bun]]) bun=fs;
    if(fd<n && v[h[fd]]<v[h[bun]]) bun=fd;
    if(bun!=p){
        swap(bun,p);
        coboara(bun,n);
    }
}


int main()
{
    FILE *fi=fopen("heapuri.in", "r"), *fo=fopen("heapuri.out", "w");
    int last, op, p, j, c, x;
    fscanf(fi, "%d", &op);
    last=1;
    p=1;
    for(j=0;j<op;j++){
        fscanf(fi, "%d", &c);
        if(c==3)
            fprintf(fo, "%d\n", v[h[1]]);
        else{
            fscanf(fi, "%d", &x);
            if(c==1){
                v[p]=x;
                poz[p]=last;
                h[last]=p;
                urca(last++);
                p++;
            }
            if(c==2){
                x=poz[x];
                swap(x,--last);
                coboara(x,last);
            }
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}