Задача из разряда спортивного программирования. Проблема - вылетает Time Limit Exceed (Описание проблемы ниже)
Есть задача в контесте (в спортивном программировании новичок) по выводу результатов операции над некоторым массивом.
Форматы ввода и вывода:

Здесь в вводе первой строкой - кол-во элементов в массиве и кол-во операций (границы для обоих значений от 1 до 10^5), второй строкой - сам массив (границы значений от -1000 до 1000). Далее, построчно идут операции, где '=' - это операция присваивания i-тому элементу массива значения m, а '?' - операция поиска и вывода суммы элементов на отрезке массива, где заданы границы отрезка. Формат вывода - построчный вывод результата каждой операции '?'.
Написал следующее решение:
public static void main(String[] args) {
String[] lines = new BufferedReader(new InputStreamReader(System.in))
.lines()
.toArray(String[]::new);
String[] input = lines[0].split(" ");
int[] b = Arrays.stream(lines[1].split(" ")).mapToInt(Integer::parseInt).toArray();
int sum, start, end, bn;
int k = Integer.parseInt(input[1]);
for (int i = 2; i < k + 2; i++) {
input = lines[i].split(" ");
if ("?".equals(input[0])) {
sum = 0;
start = Integer.parseInt(input[1]) - 1;
end = Integer.parseInt(input[2]);
while (start < end) {
sum += b[start++];
}
System.out.println(sum);
} else if ("=".equals(input[0])) {
bn = Integer.parseInt(input[1]) - 1;
b[bn] = Integer.parseInt(input[2]);
}
}
}
Алгоритм составил правильно, но на одном из тестов в контесте выдаёт TLE (ограничение - 2.5 секунда). В операции '?' втупую каждый раз перебираю сумму отрезков и полагаю, что есть более эффективный способ. Но не могу додуматься его улучшить. Нужна помощь или подсказка экспертов.