Pagini recente » Cod sursa (job #1846238) | Cod sursa (job #374487) | Cod sursa (job #1110545) | Cod sursa (job #449466) | Cod sursa (job #866263)
Cod sursa(job #866263)
#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
struct lista{
long p1, p2;
}pozitii[MAX_N]; //retine pozitiile elementelor intrate
/// 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(heap[t] > heap[pos]){
swap(heap[t],heap[pos]);
swap(pozitii[t].p2,pozitii[pos].p2);
urca(t);
}
}
}
///---==coboara elementul in heap ===---//
void coboara(long long pos){
long fs = fiu_stanga(pos);
long fd = fiu_dreapta(pos);
if(fs<=size &&heap[pos] > heap[fs]){
swap(heap[pos], heap[fs]), swap(pozitii[pos].p2,pozitii[fs].p2),coboara(fs);
}else if(fd<=size && heap[pos] > heap[fd]){
swap(heap[pos], heap[fd]), swap(pozitii[pos].p2,pozitii[fd].p2); coboara(fd);
}
}
void sterge(long pos){
long pos_final;
for(int i=1; i<=size; i++)
if(pos == pozitii[i].p2){
pos_final = pozitii[i].p1; break;
}
swap(heap[pos_final], heap[size]);
size --; // micsorez dimensiunea heapului;
coboara(pos_final); // cobor in heap frunza;
}
void adauga(long long element){
size ++;
heap[size] = element;
pozitii[size].p1 = size;
pozitii[size].p2 = 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){
fout << minim() << '\n';
}
}
return 0;
}