Cod sursa(job #1074028)

Utilizator IeewIordache Bogdan Ieew Data 7 ianuarie 2014 00:53:13
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <fstream>

using namespace std;

#define DEBUG false

#if DEBUG
#include <iostream>
#define MAXN 10
#define INFILE "/Users/biordach/Documents/Xcode Projects/training/training/heapuri.in"
#define __OUT cout
#else
#define MAXN 200001
#define INFILE "heapuri.in"
#define OUTFILE "heapuri.out"
ofstream __OUT(OUTFILE);
#endif

void readInput();
void solve();
void printOutput();

int pos[MAXN];

struct node
{
    int pos;
    int value;
}heap[MAXN];

int pos_index = 0;
int heap_index = 1;

int main(int argc, const char * argv[])
{
    readInput();
//  solve();
//  printOutput();

#if DEBUG == false
    __OUT.close();
#endif
    
    return 0;
}

void addToHeap(int x){
    pos[pos_index] = heap_index;
    heap[heap_index].pos = pos_index;
    heap[heap_index].value = x;
    int x_index = heap_index;
    
    pos_index ++;
    heap_index ++;
    
    while (x_index/2 > 0 && heap[x_index/2].value > x){
        node aux = heap[x_index/2];
        heap[x_index/2] = heap[x_index];
        pos[heap[x_index].pos] = x_index/2;

        heap[x_index] = aux;
        pos[heap[x_index].pos] = x_index;
        
        x_index /= 2;
    }
}

void printMin(){
    __OUT<<heap[1].value<<'\n';
}

void remove(int index){
    int x_index = pos[index-1];
    heap_index --;
    heap[x_index] = heap[heap_index];
    pos[heap[x_index].pos] = x_index;
    
    int x = heap[x_index].value;
    
    while((x_index * 2 < heap_index && heap[x_index*2].value < x) || (x_index * 2 +1< heap_index && heap[x_index*2+1].value < x)){
        int min_index = x_index * 2;
        if(x_index * 2 +1 < heap_index){
            min_index = heap[x_index * 2].value  < heap[x_index*2+1].value ? x_index * 2 : x_index * 2 +1;
        }
        node aux = heap[min_index];
        
        heap[min_index] = heap[x_index];
        pos[heap[min_index].pos] = min_index;
        
        heap[x_index] = aux;
        pos[heap[x_index].pos] = x_index;

        
        x_index = min_index;
        
    }
}

void readInput(){
    ifstream in(INFILE);
    int n;
    in>>n;
    int op, x;
    for(int i=0;i<n;i++){
        in >> op;
        if(op == 1){
            in >> x;
            addToHeap(x);
        } else if(op == 2){
            in >> x;
            remove(x);
        } else printMin();
    }
    in.close();
}

void solve(){
}

void printOutput(){
}