Cod sursa(job #866483)

Utilizator RobertSSamoilescu Robert RobertS Data 28 ianuarie 2013 10:08:19
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include<iostream>
#include<fstream>
using namespace std;
#define MAX_N 200000
typedef long long Heap[MAX_N];
 
long n; // numarul de randuri ce urmeaza a fi citite
Heap heap; // vectorul de heapuri
long size; // lungimea vectorului de heapuri
long V[MAX_N], poz[MAX_N];

/// returneaza radacina, deci minimul (minheap)
inline long long minim(){
    return heap[1];
}

// retuneaza tata elementului de pe pozitia k
inline long long tata(long k){
    return k/2;
}

//-----===Returneaza pozitia filui din stanga ===---//
inline long long fiu_stanga(long k){
    return 2*k;
}
 
//-----====Returneaza pozitia filui din dreapta---=====//
inline long long fiu_dreapta(long k){
    return 2*k+1;
}
 
 
//---=== urca elementul in heap === ----///
void urca(long long pos){
    long t = tata(pos);
    if(t){
        if(V[heap[t]] > V[heap[pos]]){
            poz[heap[t]] = pos, poz[heap[pos]] = pos/2;
			swap(heap[t],heap[pos]);
            urca(t);
        }
    }
     
}
 
///---==coboara elementul in heap ===---//
void coboara(long long pos){
    long fs = fiu_stanga(pos);
    long fd = fiu_dreapta(pos);
     
     
    if(fs<=size && V[heap[pos]] > V[heap[fs]]){
        poz[heap[pos]]=2*pos, poz[heap[fs]] = pos, swap(heap[pos], heap[fs]),coboara(fs);
    }else if(fd<=size && heap[pos] > heap[fd]){
        poz[pos]=2*pos+1, poz[fd] = pos,swap(heap[pos], heap[fd]), coboara(fd);
    }
}
 
 
void sterge(long pos){
     
    swap(heap[poz[pos]], heap[size]);
    size --; // micsorez dimensiunea heapului;
    coboara(poz[pos]); // cobor in heap frunza;
}
 
void adauga(long long element){
    size ++;
	V[size] = element;
    heap[size] = size;
	poz[size] = size;
	
    if(size != 1)
        urca(size); // urca in arbore pt a crea un minheap
}
 
 
int main(){
 
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
     
     
    fin >> n;
     
    for(long i=1; i<=n; i++){
        short int operatie;
        long long element;
        fin >> operatie;
            if(operatie == 1){
                fin >> element, adauga(element);
            }else if(operatie == 2){
                fin >> element;
                sterge(element);
            }else if(operatie == 3){
				long index =  minim();
               fout << V[index]<< '\n';
            }
    }
     
     
return 0;
}