Можно было бы как-то так:
static int pres,qres;
static int[] A;
static int M=10;
bool Find1(int p,int q){
if(A[q]-A[p]==M){
pres=p; qres=q;
return true;
}
if(A[q]-A[p]<M || q-p<2) return false;
int k=p+(q-p)/2;
if(Find1(p,k) || Find1(k,q)) return true;
return Find2(p,k,k+1,q);
}
bool Find2(int p1,int q1,int p2,int q2){ // p1<=q1<p2<=q2
if(A[p2]-A[q1]>M || A[q2]-A[p1]<M) return false;
if(A[p2]-A[p1]==M){
pres=p1; qres=p2; return true;
}
if(A[p1]==A[q1] && A[p2]==A[q2]) return false;
if(A[q1]-A[p1]>A[q2]-A[p2]){
int k=p1+(q1-p1)/2;
return Find2(p1,k,p2,q2) || Find2(k+1,q1,p2,q2);
}else{
int k=p2+(q2-p2)/2;
return Find2(p1,q1,p2,k) || Find2(p1,q1,k+1,q2);
}
}
(функция Find1 ищет пару в одном фрагменте, Find2 - в двух непересекающихся фрагментах). Но я совершенно не представляю, какая получится сложность. Не исключено, что O(n*log(n)). Зато рекурсия используется по назначению :)
UPD. Немного поправил условия - здесь часто лучше сравнивать не индексы, а сами элементы.