Исключение выдается при передаче параметров
Я получаю ошибку 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;
в начале помогло бы, но я не совсем уверен.