Cod sursa(job #1818864)

Utilizator Liviu_Ionut_MoantaMoanta Ionut Liviu Liviu_Ionut_Moanta Data 29 noiembrie 2016 21:37:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200005],i,n,cod,w[200005],k,q[200005],c,p,t,x,sol;
int main(){
    fin>>n;
    k=0;
    t=0;
    for(i=1;i<=n;i++){
        fin>>cod;
        if(cod==1){
            k++;
            t++;
            fin>>v[k];
            w[k]=t;
            q[t]=k;
            c=k;
            p=c/2;
            while(p>=0){
                    if(v[c]<v[p]){
                        swap(v[c],v[p]);
                        swap(w[c],w[p]);
                        q[w[p]]=p;
                        q[w[c]]=c;
                        c=p;
                        p=c/2;
                    }
                    else{
                        break;
                    }
                }
        }
        if(cod==2){
            fin>>x;
            sol=q[x];
            v[sol]=v[k];
            w[sol]=w[k];
            q[w[sol]]=q[w[k]];
            k--;
            c=sol;
            p=c/2;
            if(v[c]<v[p]){
            while(p>=0){
                if(v[c]<v[p]){
                    swap(v[c],v[p]);
                    swap(w[c],w[p]);
                    q[w[p]]=p;
                    q[w[c]]=c;
                    c=p;
                    p=c/2;
                    }
                    else
                        break;
                }
            }
            else{
                c=sol*2;
                p=c/2;
            while(c<=k){
                if(v[c+1]<v[c]&&c+1<=k){
                c++;
            }
                    swap(v[p],v[c]);
                    swap(w[p],w[c]);
                    q[w[p]]=p;
                    q[w[c]]=c;
                    p=c;
                    c=2*p;
                }
        }
        }
        if(cod==3){
            fout<<v[1]<<"\n";
        }
    }
    return 0;
}