#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
const int N = 1e6 + 5;
int n, m;
string s;
struct Node {
int matched = 0, open_rem = 0, close_rem = 0;
Node() {}
Node(char c) {
if (c == '(') open_rem = 1;
if (c == ')') close_rem = 1;
}
Node operator+(const Node& other) const {
Node res;
int bonus = min(open_rem, other.close_rem); // số cặp ngoặc đúng có thêm
res.matched = matched + other.matched + bonus; // số cặp ngoặc đúng sau khi gộp
res.open_rem = (open_rem - bonus) + other.open_rem; // số ngoặc mở còn thừa sau khi gộp
res.close_rem = close_rem + (other.close_rem - bonus); // số ngoặc đóng còn thừa sau khi gộp
return res;
}
};
Node seg[4 * N];
void build(int id, int l, int r) {
if (l == r) {
seg[id] = Node(s[l]);
return;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
Node get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return Node();
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s >> m;
n = s.size();
build(1, 0, n - 1);
for (int i = 0; i < m; i++) {
int l, r;
cin >> l >> r;
l--, r--;
cout << get(1, 0, n - 1, l, r).matched * 2 << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCnR5cGVkZWYgbG9uZyBsb25nIGxsOyAKdHlwZWRlZiBwYWlyIDxpbnQsIGludD4gaWk7IAoKY29uc3QgbGwgTElORiA9IDFlMTg7IApjb25zdCBpbnQgSU5GID0gMWU5OwoKY29uc3QgaW50IE4gPSAxZTYgKyA1OyAKCmludCBuLCBtOyAKc3RyaW5nIHM7IAoKc3RydWN0IE5vZGUgewoJaW50IG1hdGNoZWQgPSAwLCBvcGVuX3JlbSA9IDAsIGNsb3NlX3JlbSA9IDA7IAoKCU5vZGUoKSB7fQoKCU5vZGUoY2hhciBjKSB7CgkJaWYgKGMgPT0gJygnKSBvcGVuX3JlbSA9IDE7ICAKCQlpZiAoYyA9PSAnKScpIGNsb3NlX3JlbSA9IDE7IAoJfQoKCU5vZGUgb3BlcmF0b3IrKGNvbnN0IE5vZGUmIG90aGVyKSBjb25zdCB7CgkJTm9kZSByZXM7ICAgCgkJaW50IGJvbnVzID0gbWluKG9wZW5fcmVtLCBvdGhlci5jbG9zZV9yZW0pOyAvLyBz4buRIGPhurdwIG5nb+G6t2MgxJHDum5nIGPDsyB0aMOqbSAKCQlyZXMubWF0Y2hlZCA9IG1hdGNoZWQgKyBvdGhlci5tYXRjaGVkICsgYm9udXM7IC8vIHPhu5EgY+G6t3Agbmdv4bq3YyDEkcO6bmcgc2F1IGtoaSBn4buZcAoJCXJlcy5vcGVuX3JlbSA9IChvcGVuX3JlbSAtIGJvbnVzKSArIG90aGVyLm9wZW5fcmVtOyAvLyBz4buRIG5nb+G6t2MgbeG7nyBjw7JuIHRo4burYSBzYXUga2hpIGfhu5lwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCXJlcy5jbG9zZV9yZW0gPSBjbG9zZV9yZW0gKyAob3RoZXIuY2xvc2VfcmVtIC0gYm9udXMpOyAvLyBz4buRIG5nb+G6t2MgxJHDs25nIGPDsm4gdGjhu6thIHNhdSBraGkgZ+G7mXAKCQlyZXR1cm4gcmVzOyAKCX0KfTsgCgpOb2RlIHNlZ1s0ICogTl07IAoKdm9pZCBidWlsZChpbnQgaWQsIGludCBsLCBpbnQgcikgewoJaWYgKGwgPT0gcikgewoJCXNlZ1tpZF0gPSBOb2RlKHNbbF0pOyAKCQlyZXR1cm47IAoJfQoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCglidWlsZChpZCAqIDIsIGwsIG1pZCk7IAoJYnVpbGQoaWQgKiAyICsgMSwgbWlkICsgMSwgcik7IAoJc2VnW2lkXSA9IHNlZ1tpZCAqIDJdICsgc2VnW2lkICogMiArIDFdOyAKfQoKTm9kZSBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewoJaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gTm9kZSgpOwoJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHJldHVybiBzZWdbaWRdOyAJCglpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAgCglyZXR1cm4gZ2V0KGlkICogMiwgbCwgbWlkLCB1LCB2KSArIGdldChpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAoJY2luID4+IHMgPj4gbTsgCgluID0gcy5zaXplKCk7CgoJYnVpbGQoMSwgMCwgbiAtIDEpOyAKCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCBsLCByOyAKCQljaW4gPj4gbCA+PiByOyAKCQlsLS0sIHItLTsgCgkJY291dCA8PCBnZXQoMSwgMCwgbiAtIDEsIGwsIHIpLm1hdGNoZWQgKiAyIDw8ICdcbic7IAoJfQp9