Interesting Subarray (Codeforces 1270B)
Tags: Greedy, constructive algorithms

For an array $$$a$$$ of integers let's denote its maximal element as $$$\max(a)$$$, and minimal as $$$\min(a)$$$. We will call an array $$$a$$$ of $$$k$$$ integers interesting if $$$\max(a) - \min(a) \ge k$$$. For example, array $$$[1, 3, 4, 3]$$$ isn't interesting as $$$\max(a) - \min(a) = 4 - 1 = 3 < 4$$$ while array $$$[7, 3, 0, 4, 3]$$$ is as $$$\max(a) - \min(a) = 7 - 0 = 7 \ge 5$$$.You are given an array $$$a$$$ of $$$n$$$ integers. Find some interesting nonempty subarray of $$$a$$$, or tell that it doesn't exist.An array $$$b$$$ is a subarray of an array $$$a$$$ if $$$b$$$ can be obtained from $$$a$$$ by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end. In particular, an array is a subarray of itself.

Input: The first line contains integer number $$$t$$$ ($$$1 \le t \le 10\,000$$$). Then $$$t$$$ test cases follow.The first line of each test case contains a single integer $$$n$$$ ($$$2\le n \le 2\cdot 10^5$$$) — the length of the array.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$0\le a_i \le 10^9$$$) — the elements of the array.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output "NO" in a separate line if there is no interesting nonempty subarray in $$$a$$$. Otherwise, output "YES" in a separate line. In the next line, output two integers $$$l$$$ and $$$r$$$ ($$$1\le l \le r \le n$$$) — bounds of the chosen subarray. If there are multiple answers, print any.You can print each letter in any case (upper or lower).

Note: In the second test case of the example, one of the interesting subarrays is $$$a = [2, 0, 1, 9]$$$: $$$\max(a) - \min(a) = 9 - 0 = 9 \ge 4$$$.

Sample Inputs:
3
5
1 2 3 4 5
4
2 0 1 9
2
2019 2020

Sample Outputs:
NO
YES
1 4
NO

Solution (Python):
for _ in range(int(input())):
    n = int(input())
    arr = list(map(int, input().split()))
    mx = max(arr)
    mn = min(arr)
    found = False
    for i in range(n - 1):
        if abs(arr[i] - arr[i + 1]) > 1:
            found = True
            print('YES')
            print(i + 1, i + 2)
            break
    if found == False:
        print('NO')

Solution (Python):
t = int(input())
for _ in range(t):
    n = int(input())
    a = [int(x) for x in input().split()]
    flag = True
    for i in range(n - 1):
        if abs(a[i + 1] - a[i]) > 1:
            print('YES')
            print(i + 1, i + 2)
            flag = False
            break
    if flag:
        print('NO')

Solution (Python):
for _ in range(int(input())):
    n = int(input())
    a = list(map(int, input().split()))
    flag = True
    for i in range(n - 1):
        if abs(a[i + 1] - a[i]) >= 2:
            flag = False
            print('YES')
            print(i + 1, i + 2)
            break
    if flag:
        print('NO')