Cod sursa(job #1590330)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 4 februarie 2016 21:42:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#define MAXN 200000
int H[MAXN+1],poz[MAXN+1],nr[MAXN+1];
inline int lson(int x){
    return 2*x;
}
inline int rson(int x){
    return 2*x+1;
}
inline int tnod(int x){
    return x/2;
}
inline void swap(int x,int y,int *v){
    int aux=v[x];
    v[x]=v[y];
    v[y]=aux;
}
inline void urcare(int x){
    while(tnod(x)>0&&H[tnod(x)]>H[x]){
        swap(x,tnod(x),H);
        swap(nr[x],nr[tnod(x)],poz);
        swap(x,tnod(x),nr);
        x=tnod(x);
    }
}
inline void coborare(int x,int m){
    int flag=1;
    while(lson(x)<=m&&flag){
        flag=0;
        if(H[lson(x)]<H[x]&&(rson(x)>m||H[lson(x)]<H[rson(x)])){
            flag=1;
            swap(x,lson(x),H);
            swap(nr[x],nr[lson(x)],poz);
            swap(x,lson(x),nr);
            x=lson(x);
        }
        else
            if(rson(x)<=m&&H[x]>H[rson(x)]){
                flag=1;
                swap(x,rson(x),H);
                swap(nr[x],nr[rson(x)],poz);
                swap(x,rson(x),nr);
                x=rson(x);
            }
    }
}
int main(){
    FILE*fi,*fout;
    int i,n,t,m,x,con;
    fi=fopen("heapuri.in" ,"r");
    fout=fopen("heapuri.out" ,"w");
    fscanf(fi,"%d" ,&n);
    m=con=0;
    for(i=1;i<=n;i++){
         fscanf(fi,"%d" ,&t);
         if(t==1){
            fscanf(fi,"%d" ,&x);
            m++;
            con++;
            H[m]=x;
            nr[m]=con;
            poz[con]=m;
            urcare(m);
         }
         if(t==2){
             fscanf(fi,"%d" ,&x);
             H[poz[x]]=H[m];
             poz[nr[m]]=poz[x];
             nr[poz[x]]=nr[m];
             m--;
             coborare(poz[x],m);
         }
         if(t==3)
            fprintf(fout,"%d\n" ,H[1]);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}