time limit per test
5 seconds
memory limit per test
256 megabytes
You are given an array a of n integers, and q queries.
Each query is represented by two integers l and r (1≤l≤r≤n). Your task is to find, for each query, two indices i and j (or determine that they do not exist) such that:
- l≤i≤r;
- l≤j≤r;
- ai≠aj.
In other words, for each query, you need to find a pair of different elements among al,al+1,...,ar, or report that such a pair does not exist.
Input
The first line of the input contains a single integer t (1≤t≤104) --- the number of test cases. The descriptions of the test cases follow.
The first line of each test case contains a single integer n (2≤n≤2⋅105) --- the length of the array a.
The second line of each test case contains n integers a1,a2,...,an (1≤ai≤106) --- the elements of the array a.
The third line of each test case contains a single integer q (1≤q≤2⋅105) --- the number of queries.
The next q lines contain two integers each, l and r (1≤l<r≤n) --- the boundaries of the query.
It is guaranteed that the sum of the values of n across all test cases does not exceed 2⋅105. Similarly, it is guaranteed that the sum of the values of q across all test cases does not exceed 2⋅105.
Output
For each query, output two integers separated by space: i and j (l≤i,j≤r), for which ai≠aj. If such a pair does not exist, output i=−1 and j=−1.
You may separate the outputs for the test cases with empty lines. This is not a mandatory requirement.
Example
Input
Copy
5
5
1 1 2 1 1
3
1 5
1 2
1 3
6
30 20 20 10 10 20
5
1 2
2 3
2 4
2 6
3 5
4
5 2 3 4
4
1 2
1 4
2 3
2 4
5
1 4 3 2 4
5
1 5
2 4
3 4
3 5
4 5
5
2 3 1 4 2
7
1 2
1 4
1 5
2 4
2 5
3 5
4 5
Output
Copy
2 3
-1 -1
1 3
2 1
-1 -1
4 2
4 6
5 3
1 2
1 2
2 3
3 2
1 3
2 4
3 4
5 3
5 4
1 2
4 2
1 3
2 3
3 2
5 4
5 4
解题说明:此题是一道模拟题,可以采用动态规划算法,假设next_diff[i] 等于 i的左边第一个与arr[i]不一样的点的下标。如果 arr[i]!=arr[i-1] , next_diff[i]=i-1; 否则 next_diff[i]=next_diff[i-1];
如果,第i个数与第i-1个数不一样,记录这个不一样的地方的开端:i-1
如果i+1还是不一样的话,那么记录不一样的开端:i
如果后面都一样,那么后面都等于 i
如果区间[l,r] 之间所有数都一样,那么 next_diff[l]=next_diff[r]
否则,我们只要输出 r 和next_diff[r]即可
cpp
#include <stdio.h>
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, q;
scanf("%d", &n);
int arr[200005], next_diff[200005];
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
next_diff[n - 1] = n;
for (int i = n - 2; i >= 0; i--)
{
if (arr[i] == arr[i + 1])
{
next_diff[i] = next_diff[i + 1];
}
else
{
next_diff[i] = i + 1;
}
}
scanf("%d", &q);
while (q--)
{
int l, r;
scanf("%d %d", &l, &r);
l--;
r--;
if (next_diff[l] > r)
{
printf("-1 -1\n");
}
else
{
printf("%d %d\n", l + 1, next_diff[l] + 1);
}
}
}
return 0;
}