Атакующие пары

Для решения первой подзадачи достаточно просто перебрать все пары чисел ($$$a_i$$$, $$$a_j$$$) и проверить, что $$$1 \le |i - j| \le k$$$, а также что $$$l \le |a_i - a_j| \le r$$$. Такое решение имеет асимптотику $$$O(n^2)$$$.

Для решения второй подзадачи достаточно перебирать только пары индексов ($$$i$$$, $$$j$$$), удовлетворяющие условию $$$1 \le |i - j| \le k$$$. Для этого достаточно перебрать $$$1 \le i \le n$$$ и $$$\max(0, i - k) \le j \le i - 1$$$. Такое решение имеет асимптотику $$$O(n \cdot k)$$$.

Третья подзадача может быть решена отдельно от предыдущих двух: для ее решения нам нужно найти хотя бы одну пару чисел $$$a[i] = a[j]$$$, таких, что $$$1 \le |i - j| \le k$$$. Для этого будем идти по массиву указателем $$$1 \le i \le n$$$, а также поддерживать множество последних $$$k$$$ чисел $$$a[i-k..i-1]$$$ (например, используя структуру std::set в С++ или Set в Java). Для каждого числа $$$a_i$$$ будем искать число $$$a_i$$$ в текущем множестве к ответу — таким образом, пройдя по всем $$$a_i$$$ мы найдем ответ на задачу.

Для решения четвертой подзадачи для каждого $$$a_i$$$ в множестве последних $$$k$$$ чисел $$$a[i-k..i-1]$$$ нужно проверить наличие $$$a_j$$$ такого, что $$$|a_i - a_j| \le r$$$, то есть что $$$a_i - r \le a_j \le a_i + r$$$. Это можно сделать например с помощью метода std::set::lower_bound.

Для решения последней подзадачи достаточно добавить еще одну проверку с помощью std::set::lower_bound, чтобы проверить, что $$$l \le |a_i - a_j|$$$.