Sereja and BracketsTime

**limit:**MS

**Memory Limit:**262144KB

**64bit IO Format:**%i64d &%i64u SubmitStatus

Description

Sereja has a bracket sequence *s*_{1,? S2,?...,? sn}, or, in other words, a string *s* of length *n*, consisting of characters "(" and ")".

Sereja needs to answer*m*queries, each of them are described by and integers *l*_{,? Ri } (1?≤? *) L*_{i? ≤? Ri? ≤? n) } . The answer to the*I*-th query is the length of the maximum correct bracket subsequence of sequence *s*_{l,? sli? +?1,?...,? Sri } . Help Sereja answer all queries.

You can find the definitions-a subsequence and a correct bracket sequence in the notes.

Input

The first line contains a sequence of characters *s*_{1,? S2,?...,? sn } (1?≤? *) N*. ≤?10^{6)} without any spaces. Each character is either a "("Or a")". The second line contains integer*m*(1?≤? *) M*. ≤?10^{5)} -the number of queries. Each of the next*m*Lines contains a pair of integers. The*I*-th line contains integers *l*_{,? Ri } (1?≤? *) L*_{i? ≤? Ri? ≤? n) } -the Description of the*I*-th query.

Output

Print the answer to all question on a single line. Print the answers in the order they go in the input.

Sample Input

Input

()) (()) (()) (71 12 31 21 128 125 112 10

Output

00210466

Hint

Asubsequenceof length| *x*|Of string *s*? =? *s* _{1s2 ... s | S| } (where| *S*|is the length of string*s*) is string *x*? =? *s* _{ k1sk2 ... s k| X| } (1?≤? *) K*_{1?<? K2?<?...? <? k | x|? ≤?| S|) } .

A correct bracket sequence is a bracket sequence so can be transformed to a correct aryphmetic expression by inserting characters "1" and "+" between the characters of the string. For example, bracket sequences "() ()", "(())" is correct (the resulting expressions "(1) + (1)" /c14> ","(+1) "), and" ("and" ("is not.")

For the third query required sequence would be? ()?.

For the fourth query required sequence would be? ()(())(())?.

Given a sequence, there are several pairs of complete parentheses matching codes in this sequence:

#include <cstdio> #include <cstring> #include <algorithm> #define MAXN 1111111using namespace std; struct node{int l,r,all; Node () {l=r=all=0; } Node (int a,int b,int c) {l=a,r=b,all=c; }}; Node Sum[maxn<<2];char str[maxn];void pushup (int rt) {int t=min (SUM[RT<<1].L,SUM[RT<<1|1].R); sum[rt].all=sum[rt<<1].all+sum[rt<<1|1].all+t; sum[rt].l=sum[rt<<1].l+sum[rt<<1|1].l-t; Sum[rt].r=sum[rt<<1].r+sum[rt<<1|1].r-t;} void build (int l,int R,int RT) {if (l==r) {if (str[l]== ' (') sum[rt].l++; else if (str[l]== ') ') sum[rt].r++; return; } int mid= (L+R) >>1; Build (l,mid,rt<<1); Build (mid+1,r,rt<<1|1); Pushup (RT);} Node query (int l,int r,int l,int r,int RT) {if (l>=l&&r>=r) return SUM[RT]; Node Cnt1,cnt2; int mid= (L+R) >>1; if (l<=mid) cnt1=query (l,mid,l,r,rt<<1); if (r>mid) cnt2=query (mid+1,r,l,r,rt<<1|1); int t=min (CNT1.L,CNT2.R); Return Node (cnt1.l+cnt2.l-t,cnt1.r+cnt2.r-t,cnt1.all+cnt2.all+t);} int main () {int q,l,r; scanf ("%s", str+1); scanf ("%d", &q); int N=strlen (str+1); Build (1,n,1); while (q--) {scanf ("%d%d", &l,&r); printf ("%d\n", 2*query (1,n,l,r,1). All); } return 0;}

Codeforces 380C segment Tree bracket matching