#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r, u, v, w;
};
Node sgtr[1000000 * 4 + 4];
char s[1000000 + 4];
int p, q;
void build(int x, int a, int b) {
  sgtr[x].l = a;
  sgtr[x].r = b;
  if (a == b) {
    if (s[a] == '(') {
      sgtr[x].u = 1;
      sgtr[x].v = sgtr[x].w = 0;
    } else {
      sgtr[x].u = sgtr[x].v = 0;
      sgtr[x].w = 1;
    }
  } else {
    build(x * 2, a, (a + b) / 2);
    build(x * 2 + 1, (a + b) / 2 + 1, b);
    if (sgtr[x * 2].u > sgtr[x * 2 + 1].w) {
      sgtr[x].u = sgtr[x * 2].u - sgtr[x * 2 + 1].w + sgtr[x * 2 + 1].u;
      sgtr[x].v = sgtr[x * 2].v + sgtr[x * 2 + 1].v + sgtr[x * 2 + 1].w;
      sgtr[x].w = sgtr[x * 2].w;
    } else {
      sgtr[x].u = sgtr[x * 2 + 1].u;
      sgtr[x].v = sgtr[x * 2].v + sgtr[x * 2 + 1].v + sgtr[x * 2].u;
      sgtr[x].w = sgtr[x * 2 + 1].w - sgtr[x * 2].u + sgtr[x * 2].w;
    }
  }
}
void query(int x, int a, int b) {
  if (sgtr[x].l == a && sgtr[x].r == b) {
    if (q < sgtr[x].w) {
      p += sgtr[x].v + q;
      q = sgtr[x].u;
    } else {
      p += sgtr[x].v + sgtr[x].w;
      q += sgtr[x].u - sgtr[x].w;
    }
    return;
  }
  int mid = (sgtr[x].l + sgtr[x].r) / 2;
  if (b <= mid)
    query(x * 2, a, b);
  else if (a > mid)
    query(x * 2 + 1, a, b);
  else {
    query(x * 2, a, mid);
    query(x * 2 + 1, mid + 1, b);
  }
}
int main(void) {
  scanf("%s", s);
  build(1, 0, strlen(s) - 1);
  int t;
  scanf("%d", &t);
  while (t--) {
    int a, b;
    scanf("%d%d", &a, &b);
    p = q = 0;
    query(1, a - 1, b - 1);
    printf("%d\n", p * 2);
  }
  return 0;
}
