Dopo aver tentato col metodo da polli con dei cicli for a destra e sinistra ho cercato di capire come funzionano i segment tree. Mi sembra di aver implementato correttamente il codice ma cmq i tasks piu facili mi danno output errato mentre i piu complessi mi vanno in TLE anche se e’ strano usando un segment tree. Quali errori riuscite a cogliere dal codice? Grazie mille in anticipo.
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector <int> segtree;
int length; // e' uguale al numero di bastioni
pair <int, int> chiedi (int index){
int leftWall = -1, rightWall = 1000001;
stack <pair <int, int> > stRange; // stack in cui memorizzo indice e valore in quella foglia
pair <int, int> current;
index += length; // per passare dall'indice dell'array originale all'indice del segment tree
stRange.push({1, segtree[1]});
while (!stRange.empty()){ // parto dalla radice e poi scendo giu fino alle foglie
current = stRange.top();
stRange.pop();
if (current.second > segtree[index]){
if (current.first >= length){ // se sono all'ultimo livello smetto di scendere nell'albero
if (current.first < index && current.first > leftWall)
leftWall = current.first;
if (current.first > index && current.first < rightWall)
rightWall = current.first;
} else {
stRange.push({(2*current.first) +1, segtree[(2*current.first) +1]});
stRange.push({2*current.first, segtree[2*current.first]});
}
}
}
// se non ho trovato nessuno bastione piu alto, stampo gli estremi dell'array
if (leftWall == -1)
leftWall = 0;
if (rightWall == 1000001)
rightWall = length-1;
return {leftWall, rightWall};
}
void cambia (int x, int h){
// cambiare l'indice alla foglia correlata
x += length;
// update the value at the leaf node
// at the exact index
segtree[x] = h;
while (x > 1) {
// per salire di livello nell'albero
x /= 2;
// update dei valori delle foglie
// nel livello piu alto
segtree[x] = max(segtree[2 * x], segtree[2 * x + 1]);
}
}
void inizializza(int N, vector<int> H) {
segtree = vector <int> (2*N);
length = N;
for (int i = 0; i < N; i++)
segtree[N + i] = H[i];
/* assegnare valori ai nodi interni
per calcolare il minimo in un dato intervallo */
for (int i = N - 1; i >= 1; i--)
segtree[i] = max(segtree[2 * i], segtree[2 * i + 1]);
}