Pagini recente » Monitorul de evaluare | Cod sursa (job #559991) | Cod sursa (job #2014668) | Istoria paginii utilizator/zeekliviu | Cod sursa (job #866483)
Cod sursa(job #866483)
#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;
}