/*
题意可以转化为通过s[l..r]构造出新的串t[l..r]和s不能约
t[l..r]的每个前缀,每个后缀的字符数量都必须和s[l..r]对应的前后缀字符数量不同
构造策略:
如果s[l]!=s[r]直接交换即可
否则找到s[i]!=s[j],swap(s[i],s[r]),swap(s[j],s[l]),即此时只要s[l..r]有三种不同的字符即可
所以统计每个区间内出现的字符种数即可
*/
#include<bits/stdc++.h>
using namespace std;
#define N 300005
int block,n,q,ans[N];
char s[N];
struct Query{
int l,r,id,tot;
}Q[N];
int cmp(Query a,Query b){
if(a.l/block==b.l/block)return a.r<b.r;
return a.l<b.l;
}
int cnt[26],tot;
void add(int x){
cnt[s[x]-'a']++;
if(cnt[s[x]-'a']==1)tot++;
}
void del(int x){
cnt[s[x]-'a']--;
if(cnt[s[x]-'a']==0)tot--;
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
cin>>q;
for(int i=1;i<=q;i++){
cin>>Q[i].l>>Q[i].r;
Q[i].id=i;
}
/*if(n>200){
cout<<Q[14].l<<" "<<Q[14].r<<'\n';
for(int i=25336;i<=25341;i++)cout<<s[i];
}*/
block=sqrt(n);
sort(Q+1,Q+1+q,cmp);
int L=1,R=0;
for(int i=1;i<=q;i++){
while(R<Q[i].r)add(++R);
while(L>Q[i].l)add(--L);
while(R>Q[i].r)del(R--);
while(L<Q[i].l)del(L++);
Q[i].tot=tot;
}
for(int i=1;i<=q;i++){
int l=Q[i].l,r=Q[i].r;
if(s[l]!=s[r] || l==r)ans[Q[i].id]=1;
else if(Q[i].tot>=3)ans[Q[i].id]=1;
}
for(int i=1;i<=q;i++)
if(ans[i])puts("YES");
else puts("NO");
}