Задача из разряда спортивного программирования. Проблема - вылетает 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 секунда). В операции '?' втупую каждый раз перебираю сумму отрезков и полагаю, что есть более эффективный способ. Но не могу додуматься его улучшить. Нужна помощь или подсказка экспертов.


Ответы (0 шт):