#include <bits/stdc++.h>   using namespace std;   struct Node {     int val;     int op;     int cl;     Node(int x, int y, int z) {       val = x;       op = y;       cl = z;     }     Node() { Node(0, 0, 0); };   };   string s;   vector<Node> ST;   Node temp;   int n, t, x, y, t1, t2;   void update(int root, int l, int r, int pos) {     if (l > pos || r < pos) return;     if (l == r) {       if (s[pos - 1] ==  ( ) ST[root].op = 1;       if (s[pos - 1] ==  ) ) ST[root].cl = 1;       return;     }     int mid = (l + r) / 2;     update(root * 2, l, mid, pos);     update(root * 2 + 1, mid + 1, r, pos);     ST[root].val = ST[root * 2].val + ST[root * 2 + 1].val +                    min(ST[root * 2].op - ST[root * 2].val,                        ST[root * 2 + 1].cl - ST[root * 2 + 1].val);     ST[root].op = ST[root * 2].op + ST[root * 2 + 1].op;     ST[root].cl = ST[root * 2].cl + ST[root * 2 + 1].cl;   }   Node get(int root, int l, int r, int u, int v) {     if (u > r || v < l) return Node(0, 0, 0);     if (u == l && v == r) return ST[root];     int mid = (l + r) / 2;     if (v <= mid)       return get(root * 2, l, mid, u, v);     else if (u > mid)       return get(root * 2 + 1, mid + 1, r, u, v);     else {       Node n1 = get(root * 2, l, mid, u, mid),            n2 = get(root * 2 + 1, mid + 1, r, mid + 1, v);       int t1 = n1.val + n2.val + min(n1.op - n1.val, n2.cl - n2.val);       return Node(t1, n1.op + n2.op, n1.cl + n2.cl);     }   }   int main() {     cin >> s;     n = s.size();     for (int i = 0; i < 4 * n; ++i) ST.push_back(Node(0, 0, 0));     for (int i = 1; i <= n; ++i) update(1, 1, n, i);     cin >> t;     while (t--) {       cin >> x >> y;       cout << get(1, 1, n, x, y).val * 2 << endl;     }     return 0;   }   