Cod sursa(job #2376311)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 8 martie 2019 14:49:54
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
# include <fstream>
# define DIM 200010
# define f first
# define s second
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
pair <int,int> v[DIM],x;
int pz[DIM],n,i,k,nr,val,h;
void add (pair <int,int> x){
    v[++k]=x;
    pz[v[k].s]=k;
    int p=k/2,c=k;
    while(p!=0){
        if(v[c].f<v[p].f){
            pz[v[c].s]=p;
            pz[v[p].s]=c;
            swap(v[c],v[p]);
            c=p;
            p/=2;
        }
        else
            break;
    }
}
void off(int poz){
    pz[v[k].s]=poz;
    v[poz]=v[k--];
    int p=poz/2,c=poz;
    while(p!=0){
        if(v[c].f<v[p].f){
            pz[v[c].s]=p;
            pz[v[p].s]=c;
            swap(v[c],v[p]);
            c=p;
            p/=2;
        }
        else
            break;
    }
    p=poz;
    c=2*poz;
    while(c<=k){
        if(v[c].f>v[c+1].f&&c<k)
            c++;
        if(v[c].f<v[p].f){
            pz[v[c].s]=p;
            pz[v[p].s]=c;
            swap(v[c],v[p]);
            p=c;
            c*=2;
           }
        else
            break;
    }
}
int main () {
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>val;
        if(val==1){
            nr++;
            fin>>x.f;
            x.s=nr;
            add(x);
        }
        if(val==2){
            fin>>h;
            off(pz[h]);
        }
        if(val==3)
            fout<<v[1].f<<"\n";
    }
    return 0;
}