Cod sursa(job #1329273)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 29 ianuarie 2015 12:24:22
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>
int n,op,c,p,aa,ok,b,a,nr,i,j,dh,v[200100],h[200100],poz[200100];
FILE *f,*g;
void chg(int &a,int &b){
    int aux=a;
    a=b;
    b=aux;
}
void heapins(int a){
    c=a;
    p=a/2;
    while(p>=1){
        if(v[h[c]]<v[h[p]]){
            chg(poz[ h[c] ], poz[ h[p] ]  );
            chg(h[c],h[p]);
            c=p;
            p/=2;
        }
        else
            break;
    }
}
void heapd(){
    p=1;
    c=2;
    while(c<=dh){
        if(v[ h[c] ]>v[ h[c+1] ]&&c+1<=dh)
            c++;
        if(v[ h[c] ]<v[ h[p] ]){
            chg(poz[ h[c] ], poz[ h[p] ]  );
            chg(h[c],h[p]);
            p=c;
            c*=2;
        }
        else
            break;
    }
}
int main(){
    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&op);
        if(op==3){
            fprintf(g,"%d\n",v[h[1]]);
        }
        if(op==1){
            fscanf(f,"%d",&v[++nr]);
            dh++;
            poz[nr]=dh;
            h[dh]=nr;
            heapins(dh);
        }
        if(op==2){
            fscanf(f,"%d",&a);
            //a=v[a];
            a=poz[a];
            chg(h[a],h[dh]);
            chg(poz[ h[a] ], poz[ h[dh] ]  );
            poz[h[dh]]=200000;
            dh--;
            aa=h[a];
            b=v[ h[a] ];
            v[ h[a]] =-1;
            heapins(poz[ h[a] ]);
            v[ aa ]=b;
            heapd();
        }
    }




    fclose(f);
    fclose(g);
    return 0;
}