Description
Given an array with n integers, and you are given two indices i and j (i ≠ j) in the array. You have to find two integers in the range whose difference is minimum. You have to print this value. The array is indexed from 0 to n-1.
Input
Input starts with an integer T (≤ 5), denoting the number of test cases.
Each case contains two integers n (2 ≤ n ≤ 105) and q (1 ≤ q ≤ 10000). The next line contains n space separated integers which form the array. These integers range in [1, 1000].
Each of the next q lines contains two integers i and j (0 ≤ i < j < n).
Output
For each test case, print the case number in a line. Then for each query, print the desired result.
Sample Input
2
5 3
10 2 3 12 7
0 2
0 4
2 4
2 1
1 2
0 1
Sample Output
Case 1:
1
1
4
Case 2:
1
分析:
求区间最小值。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
int pp[100005];
int cc[1005];
int n,m;
void solve()
{
int a,b;
scanf("%d%d",&a,&b);
if(b-a+1>1000)
{
printf("0\n");
return;
}
memset(cc,0,sizeof(cc));
for(int i=a;i<=b;i++)
++cc[pp[i]];
int ccase=-1,dis=10005,tp=0;
for(int i=0;i<1005&&tp<=b-a;++i)
{
if(cc[i]>1)
{
dis=0;
break;
}
if(cc[i])
{
++tp;
if(ccase!=-1&&i-ccase<dis)
{
dis=i-ccase;
}
ccase=i;
}
}
printf("%d\n",dis);
}
int main()
{
int t;
scanf("%d",&t);
int cnt=0;
while(t--)
{
scanf("%d%d",&n,&m);
for(int j=0;j<n;++j)
{
scanf("%d",pp+j);
}
printf("Case %d:\n",++cnt);
while(m--)
{
solve();
}
}
return 0;
}