#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; typedef long double LD; typedef vector VI; typedef pair PII; const LD eps=1e-9; const LD PI=atan2((LD)0,(LD)-1); const int MOD=9973; const int INF=1<<30; const int ARR_INF=1<<6; const int MAXN=100005; struct node{ int l,r; int val; }tree[MAXN*4]; char s[MAXN]; int a[MAXN]; void Build(int now,int l,int r) { tree[now].l=l; tree[now].r=r; if(l==r) tree[now].val=a[l]; else { int mid=(l+r)>>1; int nxt=now<<1; Build(nxt,l,mid); Build(nxt+1,mid+1,r); tree[now].val=(tree[nxt].val*tree[nxt+1].val)%MOD; } return; } int Query(int now,int l,int r) { if(tree[now].l==l&&tree[now].r==r) return tree[now].val; int mid=(tree[now].l+tree[now].r)>>1; int nxt=now<<1; if(r<=mid) return Query(nxt,l,r); if(l>mid) return Query(nxt+1,l,r); int lval=Query(nxt,l,mid); int rval=Query(nxt+1,mid+1,r); return (lval*rval)%MOD; } void Update(int now,int aim,int val) { int mid=(tree[now].l+tree[now].r)>>1; int nxt=now<<1; if(tree[now].l==tree[now].r) tree[now].val=val; else { if(aim<=mid) Update(nxt,aim,val); else Update(nxt+1,aim,val); tree[now].val=(tree[nxt].val*tree[nxt+1].val)%MOD; } return; } int main() { int n; while(scanf("%d",&n)!=EOF) { scanf("%s",s); for(int i=0;s[i]!='\0';i++) a[i]=s[i]-28; int len=strlen(s); Build(1,0,len-1); while(n--) { int l,r; scanf("%d%d",&l,&r); printf("%d\n",Query(1,l-1,r-1)); } } return 0; }