Наличие
cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n];
C=new int[q];
вы проверяете, вводите ли вы действительные размеры, даже не что-то
что (): std :: bad_array_new_length
указывает значение n и / или q слишком велико для new [n]
или new[q]
. Это очень вероятно, если вы вводите отрицательные целые числа (размер без знака ), или может иметь место, если вы не вводите 2 действительных целых числа, так что хотя бы одно из переменных не инициализировано (неопределенное поведение ) или, конечно, если вы введете хотя бы очень большое целое число.
В общем случае все cin >> ...
, должны быть if (!(cin >> ...)) { ...error management ... }
Так что, по крайней мере:
if (!(cin >> n >> q) || (n < 1) || (q < 1)) {
cerr << "invalid sizes" << endl;
return -1;
}
Наличие
J=new int[n];
...
for(int j=1;j<n+1;j++){
J[j]=J[j-1]+(A[j-1]*B[j-1]);
}
J[j]
равен J[n]
на последнем повороте, поэтому вы записываете из выделенного массива
Также в
for(int i=0;i<q;i++){
cin >> l >> r;
if(r==1){
C[i]=J[1];
}
else{
C[i]=J[r]-J[l-1];
}
вы не проверяете значения l и r , которые являются действительными индексами, а также если целое число было задано в качестве входных данных
cin >> l >> r;
может быть что-то вроде
if (!(cin >> l >> r) ||
(r < 0) || (r >= n) ||
(l < 1) || (l >= (n - 1))) {
cerr << "invalid indexes" << endl;
return -1;
}