Cod sursa(job #2315507)

Utilizator CozehNita Horia Teodor Cozeh Data 10 ianuarie 2019 01:01:33
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#define nmax 200005
#include <fstream>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int heapSize,order;
int pos[nmax],invPos[nmax];
int heap[nmax];

void addNumber(int nr){
    
    heapSize++;
    order++;
    heap[heapSize] = nr;
    pos[heapSize] = order;
    invPos[pos[order]] = order;
    int node = heapSize;
    while(node != 1 && heap[node] < heap[node/2]){
        swap(heap[node/2],heap[node]);
        swap(pos[node/2],pos[node]);
        swap(invPos[pos[node/2]],invPos[pos[node]]);
        node /= 2;
    }
 
}

void removeNumber(int node){
    
    node = invPos[node];
    swap(heap[node],heap[heapSize]);
    swap(pos[node],pos[heapSize]);
    swap(invPos[pos[node]],invPos[pos[heapSize]]);
    invPos[pos[heapSize]] = 0;
    pos[heapSize] = 0;
    heapSize--;
    while(node <= heapSize){
        if(heap[node*2] < heap[(node*2)+1]){
            if(node*2 <= heapSize && heap[node] > heap[node*2]){
                swap(heap[node],heap[node*2]);
                swap(pos[node*2],pos[node]);
                swap(invPos[pos[node*2]],invPos[pos[node]]);
            }
            else break;
        }
        else{
            if((node*2)+1 <= heapSize && heap[node] > heap[(node*2)+1]){
                swap(heap[node],heap[(node*2)+1]);
                swap(pos[(node*2)+1],pos[node]);
                swap(invPos[pos[(node*2)+1]],invPos[pos[node]]);
            }
            else break;
        }
    }
    
    
}

int main(){
    
    int n;
    fin>>n;
    int i,code,arg;
    for(i = 0; i < n; i++){
        fin>>code;
        if(code == 1){
            fin>>arg;
            addNumber(arg);
        }
        else if(code == 2){
            fin>>arg;
            removeNumber(arg);
        }
        else if(code == 3){
            fout<<heap[1]<<"\n";
        }
    }
    
}