#小明的区间
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>z1,z2;//存区间的左右下标
int main(void)
{
int n,k,L=0,R=0,Count=0;
scanf("%d%d",&n,&k);
int a[n+5],s[k+5];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
memset(s,0,sizeof(s));
while(R<n)
{//采用双指针提前找好符合条件的区域
//R快L慢,符合条件后慢指针走到不符合条件
//然后快指针再走到符合条件,反复便可找到所有区域
if(s[a[R]]==0)//因为ai<=k所以可以直接没走过的就计数,否则就再加个范围判断
Count++;//刚开始的时候都是没走过的,走一种加一种
s[a[R]]++;//踩过就能记录次数,不会重复count了
while(Count==k)
{//为什么要while因为可能2222231这样子一堆2要清
//但这些区域我都要
z1.push_back(L);
z2.push_back(R);
s[a[L]]--;
if(s[a[L]]==0)
Count--;//某种数清零成功了
L++;//慢指针移动
}
R++;//快指针
}
/*
for(int i=0;i<z1.size();i++)
{
for(int j=z1[i];j<=z2[i];j++)
printf("%d ",a[j]);
printf("\n");
}
*/
int N;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
int left,right;
scanf("%d%d",&left,&right);
left--;
right--;
//转换为数组下标
//容器的二分的和普通的int数组调用形式有所区别的
//返回的是指针,取值直接就是容器内的那个数了
auto j=lower_bound(z1.begin(),z1.end(),left);
//二分找到第一个在查询区域内的区域的左边
if(j!=z1.end()&&*j<=right&&z2[j-z1.begin()]<=right)//且这个区域的右边也在里面
printf("YES\n");
else
printf("NO\n");
}
return 0;
}