#include <bits/stdc++.h>
using namespace std;
struct node {
  int o;
  int c;
  int t;
};
string s;
node segtree[5 * 1000000 + 20];
void build(int l, int r, int idx) {
  if (l == r) {
    if (s[l] == '(') {
      segtree[idx].o = 1;
    } else
      segtree[idx].c = 1;
    segtree[idx].t = 0;
    return;
  }
  build(l, (l + r) / 2, 2 * idx);
  build((l + r) / 2 + 1, r, 2 * idx + 1);
  int temp = min(segtree[2 * idx].o, segtree[2 * idx + 1].c);
  segtree[idx].t = segtree[2 * idx].t + segtree[2 * idx + 1].t + temp;
  segtree[idx].o = segtree[2 * idx].o + segtree[2 * idx + 1].o - temp;
  segtree[idx].c = segtree[2 * idx].c + segtree[2 * idx + 1].c - temp;
}
node query(int l, int r, int x, int y, int idx) {
  if (l > y || r < x) {
    node e;
    e.o = e.c = e.t = 0;
    return e;
  }
  if (x <= l && r <= y) {
    node e;
    e.o = segtree[idx].o;
    e.c = segtree[idx].c;
    e.t = segtree[idx].t;
    return e;
  }
  node a = query(l, (l + r) / 2, x, y, 2 * idx),
       b = query((l + r) / 2 + 1, r, x, y, 2 * idx + 1);
  int temp = min(a.o, b.c);
  node e;
  e.t = a.t + b.t + temp;
  e.o = a.o + b.o - temp;
  e.c = a.c + b.c - temp;
  return e;
}
int main() {
  int m;
  cin >> s >> m;
  int n = (int)s.length();
  build(0, n - 1, 1);
  for (int i = 0; i < m; i++) {
    int l, r;
    cin >> l >> r;
    l--, r--;
    node e = query(0, n - 1, l, r, 1);
    cout << e.t * 2 << endl;
  }
  return 0;
}
