Исключение выдается при передаче параметров

Я получаю ошибку Exception thrown at 0x009523B9 in Project5.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00E42ED4). в приведенной ниже программе

прецедент:

5

1 2 3 4 5

1

Q 2 4

Я получаю ошибку при выполнении этой строки struct node query(int index, int start, int endv, int l, int r)вот когда query функция была вызвана впервые в основной

Параметр был как на момент исключения должен бытьquery(0,0,4,1,3)

но они автоматически меняются на query(0,1,1,1,3)где я делаю не так

Это был вопрос, основанный на сегменте деревьев спой КГСС

#include<iostream>
#include<algorithm>
#include<climits>
#pragma warning(disable:4996)    //disable scanf warning 
using namespace std;

struct node {
    long long int maxsum;
    long long int maxnum;
};
long long int a[100];
struct node tree[100];
void build(int index, int start, int endv) {
    if (start == endv) {
        tree[index].maxsum = a[start];
        tree[index].maxnum = a[start];
    }
    else {
        int mid = (start + endv) / 2;
        build(2 * index + 1, start, mid);
        build(2 * index + 2, mid + 1, endv);

        tree[index].maxnum = max(tree[2 * index + 1].maxnum, tree[2 * index + 2].maxnum);
        tree[index].maxsum = max(tree[2 * index + 1].maxnum + tree[2 * index + 2].maxnum, max(tree[2 * index + 1].maxsum, tree[2 * index + 2].maxsum));
    }
}

struct node query(int index, int start, int endv, int l, int r) {

    struct node result;

    result.maxnum = INT_MIN;
    result.maxsum = INT_MIN;

    if (l > endv || r < start)
        return result;
    int mid = (start + endv) / 2;
    struct node left, right;
    left = query(index, start, mid, l, r);
    right = query(index, mid + 1, endv, l, r);

    tree[index].maxnum = max(left.maxnum, right.maxnum);
    tree[index].maxsum = max(left.maxnum + right.maxnum, max(left.maxsum, right.maxsum));

    return tree[index];
}

void update(int index, int start, int endv, int aidx, long long int value) {


    if (start == endv) {
        a[aidx] = value;
        tree[index].maxsum = value;
        tree[index].maxnum = value;
    }
    else {

        int mid = (start + endv) / 2;
        if (aidx <= mid) {
            update(2 * index + 1, start, mid, aidx, value);
        }
        else {
            update(2 * index + 2, mid + 1, endv, aidx, value);
        }

        tree[index].maxnum = max(tree[2 * index + 1].maxnum, tree[2 * index + 2].maxnum);
        tree[index].maxsum = max(tree[2 * index + 1].maxnum + tree[2 * index + 2].maxnum, max(tree[2 * index + 1].maxsum, tree[2 * index + 2].maxsum));
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    build(0, 0, n - 1);
    //for(int i = 0)
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        int l, r;
        char ap;
        cin >> ap >> l >> r;
        if (ap == 'U') {
            update(0, 0, n - 1, l - 1, r);
        }
        else {
            struct node temp = query(0, 0, n - 1, l - 1, r - 1);
            printf("%lld\n", temp.maxsum);
        }
    }

}

ПРИМЕЧАНИЕ -> Я использовал result.maxnum = INT_MIN; result.maxsum = INT_MIN;

в функции запроса и result.maxnum а также result.maxsum являются из long long int типы и я назначаю INT_MIN им.

Это потому, что иногда с обеих сторон рекурсии я получаю минимальное значение и добавляя эти значения и сохраняя их в int Переменная приводит к целочисленному переполнению, поэтому я использовал long long int может кто-то предоставить способ для решения этой ситуации, или это нормально

1 ответ

Решение
    scanf("%d", &a[i]);

неверно, когда тип a[i] является long long int, Также не рекомендуется смешивать ввод-вывод C++ с вводом-выводом. Там нет ничего плохого в

cin >> a[i];

Но главная проблема в том, что у вас переполнение стека. В вашем примере

query(0,0,4,1,3) ->
 query(0,0,2,1,3) ->
  query(0,0,1,1,3) ->
   query(0,0,0,1,3) ->
    return result
   query(0,1,1,1,3) ->
    query(0,1,1,1,3) ->
     query(0,1,1,1,3) ->
      query(0,1,1,1,3) ->
       query(0,1,1,1,3) ->
        query(0,1,1,1,3) ->
         query(0,1,1,1,3) ->
          BOOM!! stack overflow

Не совсем уверен, что нужно сделать, чтобы это исправить, так как я не понимаю код. Я бы подумал что-то вроде

if (start >= endv)
    return result;

в начале помогло бы, но я не совсем уверен.

Другие вопросы по тегам