Interval Tree — функция для главной неисправности

У меня есть вопрос по деревьям интервалов, который нужно решить, и я в основном знаю алгоритм, но у меня есть проблема в моем коде, когда мои функции возвращают значение его основному.

Сам вопрос, который я задаю, — найти максимальное значение между определенными индексами и обновить какое-либо значение в массиве. Итак, есть начальный массив с n числами и m операциями. Если операция начинается с 0, я должен выполнить опрос по максимальному значению между индексами x, Если операция начинается с 1, я должен обновить значение индекса x на начальном векторе с y,

Проблема в том, что при некоторых опросах он возвращает в файл правильный ответ, а в некоторых просто дает «случайные» числа.

Я сделал несколько printf во время кода, чтобы я мог контролировать ответ, и я увидел, что в конце, в функции, перед возвратом значения это совершенно правильно, и когда я проверяю его в main сразу после функции, это дает мне результат Я говорил тебе.

Это вход, который я тестирую на:

5 5
4 3 5 6 1
0 1 3
1 3 2
0 2 3
1 4 2
0 1 5

Код:

#include <stdio.h>
FILE *fin, *fout;
int pos, val, m, n, *arb;
bool f;
int max(int a, int b);
void pun(int nod, int st1, int dr1);
int interogare(int nod, int st1, int dr1, int st2, int dr2);
int main()
{
fin = fopen("arbori.in", "r");
fout = fopen("arbori.out", "w");
fscanf(fin, "%d%d", &n, &m);
arb = new int[2*n];
for(int i = 1; i<= 2*n - 1; i++) arb[i] = 0;
for(int i =1; i<= n; i++)
{
pos = i;
fscanf(fin, "%d", &val);
pun(1, 1, n);
}
for(int i =1; i<= m; i++)
{
fscanf(fin, "%d", &f);
if(f == 1)
{
fscanf(fin, "%d%d", &pos, &val);
pun(1, 1, n);
}
else
{
fscanf(fin, "%d%d", &pos, &val);
fprintf(fout, "%d\n", interogare(1, 1, n, pos, val));//if i check it here it's not good
}
}
return 0;
}
int max(int a, int b)
{
return (a> b)?a:b;
}
void pun(int nod, int st1, int dr1)//update function - working properly
{
if(st1 == dr1)
{
arb[nod] = val;
return ;
}
int mij = (st1 + dr1)/2;
if(pos <= mij) pun(2*nod, st1, mij);
else pun(2*nod+1, mij +1, dr1);
arb[nod] = max(arb[2*nod + 1], arb[2*nod]);
return ;
}
int interogare(int nod, int st1, int dr1, int st2, int dr2)//interogation function
{
if(st1 == st2 && dr1 == dr2) return arb[nod];//if i check my result here it is the expected one
int mij = (st1 + dr1)/2;
if(st2 > mij) interogare(2*nod+1, mij+1, dr1, st2, dr2);
if(dr2 <= mij) interogare(2*nod, st1, mij, st2, dr2);
if(st2 <= mij && dr2 > mij) return max(interogare(2*nod, st1, mij, st2, mij),interogare(2*nod+1, mij + 1, dr1, mij + 1, dr2));
}

Извините за длинный пост и длинный код, если я что-то пропустил, пожалуйста, напомните мне.

Заранее спасибо!

1

Решение

Когда вы звоните interogare рекурсивно, вы не вернете результат:

int interogare(int nod, int st1, int dr1, int st2, int dr2)//interogation function
{
if(st1 == st2 && dr1 == dr2) return arb[nod];//if i check my result here it is the expected one
int mij = (st1 + dr1)/2;
if(st2 > mij) return interogare(2*nod+1, mij+1, dr1, st2, dr2);
if(dr2 <= mij) return interogare(2*nod, st1, mij, st2, dr2);
if(st2 <= mij && dr2 > mij) return max(interogare(2*nod, st1, mij, st2, mij),interogare(2*nod+1, mij + 1, dr1, mij + 1, dr2));
}
1

Другие решения


По вопросам рекламы [email protected]