int buildSegmentTree(int begin,int end,int rootIndex){
	segmentTree[rootIndex].begin=begin;
	segmentTree[rootIndex].end=end;
	if(end-begin==1)
		segmentTree[rootIndex].max=sections[begin].end-sections[begin].begin;
	else{
		int mid=(begin+end)/2;
		segmentTree[rootIndex].max=std::max(buildSegmentTree(begin,mid,leftChild(rootIndex)),
											buildSegmentTree(mid,end,rightChild(rootIndex)));
	}
	return segmentTree[rootIndex].max;
}
int main(){
	while(true){
		scanf("%d",&sequenceNum);
		if(sequenceNum==0)
			return 0;
		int queryNum;
		scanf("%d",&queryNum);
		for(int sequenceIndex=0;sequenceIndex<sequenceNum;sequenceIndex++)
			scanf("%d",sequence+sequenceIndex);
		splitIntoSections();
		buildSegmentTree(0,sectionNum,0);
		while(queryNum--){
			int begin,end;
			scanf("%d%d",&begin,&end);
			begin--;
			if(sequence[begin]==sequence[end-1]){
				printf("%d\n",end-begin);
				continue;
			}
			int firstSectionIndex=findSectionIndex(sequence[begin]);
			int firstSectionLen=sections[firstSectionIndex].end-begin;

			int lastSectionIndex=findSectionIndex(sequence[end-1]);
			int lastSectionLen=end-sections[lastSectionIndex].begin;

			int midSectionLenMax=querySegmentTree(firstSectionIndex+1,lastSectionIndex,0);
			printf("%d\n",std::max(midSectionLenMax,std::max(firstSectionLen,lastSectionLen)));
		}
	}
}
 NumArray(vector<int> &nums) {
     numbers = nums;
     if(nums.size() >= 1){
         rootNode = buildSegmentTree(0, 0, nums.size()-1, nums);
     }
 }