решаю задачу "4. Приоритетная очередь" на стр.11
https://informatics.msk.ru/pluginfile.php/5946/mod....
В условии указано 2 правила для данной задачи:
1) Процедуры просеивания не должны перемещать элемент дальше, чем это
действительно необходимо. Например, если A[i] =A[2*i], то вызов
Sift_Up(2*i) не должен менять местами эти два элемента (хотя их обмен и не
испортит кучу, он бесполезен).
2) Если при просеивании вниз можно перемещать рассматриваемый элемент
как влево вниз, так и вправо вниз (это бывает, когда он меньше двух равных
дочерних), то следует выбирать направление влево.
Втрое правило довольно произвольно и введено лишь для обеспечения однозначности ответа. Первому правилу, напротив, должна удовлетворять любая
разумная реализация кучи.
Если второй пункт мне понятен, и я учел его, то в первом пункте мне не понятно как связаны индексы i и 2*i, думаю именно из-за этого мое решение не проходит часть тестов. Подскажите как исправить мой код, прикрепляю его ниже:
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
struct MaxHeap{
int size = 0;
int maxCapacity;
vector<ll> arr;
MaxHeap(int n) : maxCapacity(n) {
arr.reserve(maxCapacity);
}
pair<int, ll> extractMax(){
if (size == 0) return pair<int, ll>(-1, -1);
pair<int, ll> res = {0, arr[0]};
arr[0] = arr[--size];
int current = 0;
while (2*current+1 < size){
int maxP = (arr[2*current+1] >= arr[2*current+2] ? 2*current+1 : 2*current+2);
if (arr[current] < arr[maxP]){
swap(arr[current], arr[maxP]);
current = maxP;
res.first = maxP+1;
} else {
break;
}
}
return res;
}
int add(ll num){
if (size == maxCapacity) return -1;
int current = size;
arr[size++] = num;
while (current > 0 && arr[(current-1)/2] < arr[current]){
swap(arr[(current-1)/2], arr[current]);
current = (current-1)/2;
}
return current+1;
}
};
int main(){
int n, m;
cin >> n >> m;
MaxHeap heap(n);
for (int i = 0; i < m; i++){
int command;
cin >> command;
if (command == 1){
pair<int, ll> res = heap.extractMax();
if (res.first == -1) {
cout << -1 << endl;
}
else {
cout << res.first << " " << res.second << endl;
}
} else {
ll num;
cin >> num;
cout << heap.add(num) << endl;
}
}
for (int i = 0; i < heap.size; i++) {
cout << heap.arr[i] << " ";
}
return 0;
}