#include <bits/stdc++.h>
using namespace std;
struct node {
  int t, next;
} a[800010];
struct hhhh {
  int l, r;
} h[200010];
vector<pair<int, int> > v[400010];
vector<int> g[400010];
long long ans[400010];
int fa[400010], son[400010], dep[400010], top[400010], size[400010];
int fat[400010][20], head[400010], id[400010], c[400010], len[400010], n, m, tt,
    tot;
char s[400010];
inline int rd() {
  int x = 0;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    ;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  return x;
}
inline void print(long long x) {
  static char s[233];
  if (!x) {
    putchar('0');
    putchar('\n');
    return;
  }
  int tot = 0;
  for (; x; x /= 10) s[++tot] = x % 10 + '0';
  for (; tot; tot--) putchar(s[tot]);
  putchar('\n');
}
inline void add(int x, int y) {
  a[++tot].t = y;
  a[tot].next = head[x];
  head[x] = tot;
}
namespace sam {
int ch[400010][26], fa[400010], len[400010], tot, last;
inline void init() { tot = last = 1; }
inline int insert(int x) {
  int p = last, np = ++tot;
  len[np] = len[p] + 1;
  for (; p && !ch[p][x]; p = fa[p]) ch[p][x] = np;
  if (!p)
    fa[np] = 1;
  else {
    int q = ch[p][x];
    if (len[q] == len[p] + 1)
      fa[np] = q;
    else {
      int nq = ++tot;
      memcpy(ch[nq], ch[q], sizeof(ch[q]));
      len[nq] = len[p] + 1;
      fa[nq] = fa[q];
      fa[q] = fa[np] = nq;
      for (; p && ch[p][x] == q; p = fa[p]) ch[p][x] = nq;
    }
  }
  return last = np;
}
inline void build() {
  for (int i = 2; i <= tot; i++) add(fa[i], i);
}
}  // namespace sam
inline void dfs1(int x) {
  size[x] = 1;
  for (int i = head[x]; i; i = a[i].next) {
    int t = a[i].t;
    if (t == fa[x]) continue;
    dep[t] = dep[x] + 1;
    fa[t] = x;
    dfs1(t);
    size[x] += size[t];
    if (size[t] > size[son[x]]) son[x] = t;
  }
}
inline void dfs2(int x, int tp) {
  top[x] = tp;
  if (son[x]) dfs2(son[x], tp);
  for (int i = head[x]; i; i = a[i].next) {
    int t = a[i].t;
    if (t == fa[x] || t == son[x]) continue;
    dfs2(t, t);
  }
}
struct bit {
  long long c[200010];
  inline void add(int x, long long y) {
    for (; x <= n; x += ((x) & (-(x)))) c[x] += y;
  }
  inline void modify(int l, int r, long long hh) {
    add(l, hh);
    add(r + 1, -hh);
  }
  inline long long query(int x) {
    long long res = 0;
    for (; x > 0; x -= ((x) & (-(x)))) res += c[x];
    return res;
  }
  inline long long query(int l, int r) { return query(r) - query(l - 1); }
} c1, c2, c3, c4, c5;
inline void work() {
  int hh = len[fa[c[1]]] + 1;
  for (int i = 1; i <= tt; i++) {
    int x = c[i];
    for (int t : g[x]) {
      int k = t + hh - 1;
      c1.add(k, 1);
      c2.add(k, k);
    }
  }
  for (int i = 1; i <= tt; i++) {
    int x = c[i], now = len[x] - hh + 1;
    for (pair<int, int> hhh : v[x]) {
      int t = hhh.first, now = hhh.second;
      int l = h[t].l, r = h[t].r;
      ans[t] += c1.query(r - now) * now;
      ans[t] += c1.query(r - now + 1, r) * (r + 1) - c2.query(r - now + 1, r);
      ans[t] += c3.query(r) + c4.query(r) * r - c5.query(r);
    }
    for (int t : g[x]) {
      int k = t + hh - 1;
      c1.add(k, -1);
      c2.add(k, -k);
      c3.add(k + now, now);
      c4.modify(k, k + now - 1, 1);
      c5.modify(k, k + now - 1, k - 1);
    }
  }
  for (int i = 1; i <= tt; i++) {
    int x = c[i], now = len[x] - hh + 1;
    for (int t : g[x]) {
      int k = t + hh - 1;
      c3.add(k + now, -now);
      c4.modify(k, k + now - 1, -1);
      c5.modify(k, k + now - 1, -k + 1);
      c1.add(t, 1);
    }
  }
  for (int i = 1; i <= tt; i++) {
    int x = c[i], now = len[x] - hh + 1;
    for (pair<int, int> hhh : v[x]) {
      int t = hhh.first, now = hhh.second;
      int l = h[t].l, r = h[t].r;
      ans[t] -= c1.query(l - 1) * now;
      ans[t] -= c2.query(l - 1);
    }
    for (int t : g[x]) c1.add(t, -1), c2.add(t, now);
  }
  for (int i = 1; i <= tt; i++)
    for (int t : g[c[i]]) c2.add(t, -(len[c[i]] - hh + 1));
}
inline int jump(int x, int y) {
  for (int i = 19; ~i; i--)
    if (len[fat[x][i]] >= y) x = fat[x][i];
  return x;
}
inline void gao() {
  for (int i = 1; i <= sam::tot; i++)
    if (top[i] == i) {
      tt = 0;
      for (int j = i; j; j = son[j])
        if (j > 1) c[++tt] = j;
      work();
    }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  m = rd();
  sam::init();
  for (int i = n; i; i--) id[i] = sam::insert(s[i] - 'a');
  sam::build();
  for (int i = 1; i <= sam::tot; i++) len[i] = sam::len[i];
  dfs1(1);
  dfs2(1, 1);
  for (int i = 1; i <= sam::tot; i++) fat[i][0] = fa[i];
  for (int j = 1; j < 20; j++)
    for (int i = 1; i <= sam::tot; i++) fat[i][j] = fat[fat[i][j - 1]][j - 1];
  for (int i = 1; i <= m; i++) h[i].l = rd(), h[i].r = rd();
  for (int i = 1; i <= m; i++) {
    int hh = jump(id[h[i].l], h[i].r - h[i].l + 1);
    v[hh].push_back(
        pair<int, int>(i, (h[i].r - h[i].l + 1) - len[fa[top[hh]]]));
    for (int j = fa[top[hh]]; j; j = fa[top[j]])
      v[j].push_back(pair<int, int>(i, len[j] - len[fa[top[j]]]));
  }
  for (int i = 1; i <= n; i++)
    for (int j = id[i]; j; j = fa[top[j]]) g[j].push_back(i);
  gao();
  for (int i = 1; i <= m; i++) print(ans[i]);
  return 0;
}
