#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef unsigned long long ll;
const int maxn=200010;
ll hash[maxn],seed[maxn];
int v[maxn],rt[maxn];
int n,m,k,tot;
const ll inf=-1;
struct sag
{
	int ls,rs,siz;
}s[maxn*50];
int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
void insert(int x,int &y,ll l,ll r,ll pos)
{
	if(pos>r)	return ;
	y=++tot;
	if(l==r)
	{
		s[y].siz=s[x].siz+1;
		return ;
	}
	ll mid=l/2+r/2+(l&r&1);
	if(pos<=mid)	s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,pos);
	else	s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,pos);
	s[y].siz=s[s[y].ls].siz+s[s[y].rs].siz;
}
int query(int x,int y,ll l,ll r,ll pos)
{
	if(l==r)	return s[y].siz-s[x].siz;
	ll mid=l/2+r/2+(l&r&1);
	if(pos<=mid)	return query(s[x].ls,s[y].ls,l,mid,pos);
	else	return query(s[x].rs,s[y].rs,mid+1,r,pos);
}
int main()
{
	n=rd(),m=rd(),k=rd();
	int i,j,a,b;
	ll t;
	for(seed[0]=1,i=1;i<=k;i++)	seed[i]=seed[i-1]*131;
	for(i=1;i<=n;i++)	v[i]=rd();
	for(i=1;i<=k;i++)	hash[1]=hash[1]*131+v[i];
	for(i=k+1;i<=n;i++)	hash[i-k+1]=hash[i-k]*131-v[i-k]*seed[k]+v[i];
	for(i=1;i<=n-k+1;i++)	insert(rt[i-1],rt[i],0,inf,hash[i]);
	for(i=1;i<=m;i++)
	{
		a=rd(),b=rd()-k+1;
		for(t=0,j=1;j<=k;j++)	t=t*131+rd();
		if(query(rt[a-1],rt[b],0,inf,t))	printf("No\n");
		else	printf("Yes\n");
	}
	return 0;
}