Cod sursa(job #1966628)

Utilizator GeorginskyGeorge Georginsky Data 15 aprilie 2017 14:04:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#define v first
#define ord second
#define N 200005
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n, nr, ind, p[N];
pair<int,int> h[N];

void up(int i){
    while(i/2&&h[i/2].v>h[i].v){
        swap(h[i/2], h[i]);
        swap(p[h[i/2].ord], p[h[i].ord]);
        i/=2;
    }
}

void down(int i){
    int j;
    while(2*i<=nr){
        if(2*i+1<=nr){
            j=(h[2*i].v<h[2*i+1].v?0:1)+2*i;
            swap(h[i], h[j]);
            swap(p[h[i].ord], p[h[j].ord]);
            i=j;
        }else{
            if(h[i].v>h[2*i].v){
                swap(h[i], h[2*i]);
                swap(p[h[i].ord], p[h[2*i].ord]);
                i*=2;
            }else{
                break;
            }
        }
    }
}

void add(int x){
    nr++;
    ind++;
    h[nr].v=x;
    h[nr].ord=ind;
    p[ind]=nr;
    up(nr);
}

void del(int x){
    int i=p[x], j;
    swap(h[i], h[nr]);
    swap(p[h[i].ord], p[h[nr].ord]);
    nr--;
    up(i);
    down(i);
}
/*
void print_heap(){
    int p=1, i=1, p2;
    while(i<=nr){
        p2=p;
        while(p&&i<=nr){
            cout<<h[i].v<<" ";
            p--;
            i++;
        }
        p=p2<<1;
        cout<<"\n";
    }
}
*/
int main(){
    in>>n;
    int x, y;
    for(int i=1; i<=n; i++){
        in>>x;
        if(x==3){
            out<<h[1].v<<"\n";
        }else{
            in>>y;
            if(x==1)add(y);
            else del(y);
        }
    }
    return 0;
}