#include #include #include #include #include #include #include #include #include using namespace std; int n, a, b; char str[100010]; #define mod 9973 struct node { int l, r, v; struct node *left, *right; node(int ll, int rr) { l = ll; r = rr; v = -1; left = NULL; right = NULL; } } *root = new node(1,100000); void build(node* p) { if (p->l == p->r) return; int mid = (p->l + p->r)>>1; p->left = new node(p->l, mid); p->right = new node(mid+1, p->r); build(p->left); build(p->right); } void insert(node* p, int idx) { if (p->l == p->r) { p->v = (str[idx-1] - 28)%mod; return; } int mid = (p->l + p->r)>>1; if (idx <= mid) insert(p->left, idx); else insert(p->right, idx); if (idx == p->r) p->v = (p->left->v * p->right->v)%mod; } int query(node* p, int lt, int rt) { if (p->l == lt && p->r == rt) return p->v; int mid = (p->l + p->r)>>1; if (lt > mid) return query(p->right, lt, rt); if (rt <= mid) return query(p->left, lt, rt); return (query(p->left, lt, mid) * query(p->right, mid+1, rt))%mod; } int main() { build(root); while (scanf("%d", &n) != EOF) { scanf("%s", str); int size = strlen(str), i, j; for (i = 1; i <= size; ++i) insert(root, i); while (n--) { scanf("%d%d", &a, &b); if (a > b) { j = a; a = b; b = j; } printf("%d\n", query(root, a, b)); } } }