Cod sursa(job #2314762)

Utilizator CozehNita Horia Teodor Cozeh Data 9 ianuarie 2019 00:47:57
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#define nmax 200005
#include <fstream>
using namespace std;

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

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

void addNumber(int nr){
    
    heapSize++;
    order++;
    heap[heapSize] = nr;
    pos[order] = heapSize;
    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]]);
    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";
        }
    }
    
}