树状数组求区间内范围个数。。。。
Sereja has a bracket sequence s1, 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 is described by two integers li, ri (1 ≤ li ≤ ri ≤ n). The answer to the i-th query is the length of the maximum correct bracket subsequence of sequence sli, sli + 1, ..., sri. Help Sereja answer all queries.
You can find the definitions for a subsequence and a correct bracket sequence in the notes.
The first line contains a sequence of characters s1, s2, ..., sn (1 ≤ n ≤ 106) without any spaces. Each character is either a "(" or a ")". The second line contains integer m (1 ≤ m ≤ 105) — the number of queries. Each of the next m lines contains a pair of integers. The i-th line contains integers li, ri (1 ≤ li ≤ ri ≤ n) — the description of the i-th query.
Print the answer to each question on a single line. Print the answers in the order they go in the input.
())(())(())( 7 1 1 2 3 1 2 1 12 8 12 5 11 2 10
0 0 2 10 4 6 6
A subsequence of length |x| of string s = s1s2... s|s| (where |s| is the length of string s) is string x = sk1sk2... sk|x| (1 ≤ k1 < k2 < ... < k|x| ≤ |s|).
A correct bracket sequence is a bracket sequence that can be transformed into a correct aryphmetic expression by inserting characters "1" and "+" between the characters of the string. For example, bracket sequences "()()", "(())" are correct (the resulting expressions "(1)+(1)", "((1+1)+1)"), and ")(" and "(" are not.
For the third query required sequence will be «()».
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1001000;
int tr1[maxn],tr2[maxn],tot;
char str[maxn];
int lowbit(int x)
{
return x&(-x);
}
void Add(int tr[],int n)
{
while(n<maxn)
{
tr[n]++;
n+=lowbit(n);
}
}
int Sum(int tr[],int x)
{
int sum=0;
while(x>0)
{
sum+=tr[x];
x-=lowbit(x);
}
return sum;
}
struct Interval
{
int l,r,len,ans,id;
}q[maxn],a[maxn];
bool cmp1(Interval a,Interval b)
{
if(a.len!=b.len)
{
return a.len<b.len;
}
else return a.l<b.l;
}
bool cmpID(Interval a,Interval b)
{
return a.id<b.id;
}
int st[maxn],pop=-1,m,qt;
int main()
{
scanf("%s",&str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]=='(')
{
st[++pop]=i+1;
}
else
{
if(pop>=0)
{
a[tot].l=st[pop--];
a[tot].r=i+1;
a[tot].len=a[tot].r-a[tot].l+1;
tot++;
}
}
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
q[qt].l=l,q[qt].r=r;
q[qt].len=r-l+1,q[qt].id=i;
qt++;
}
sort(q,q+qt,cmp1);
sort(a,a+tot,cmp1);
int pos=0;
for(int i=0;i<m;i++)
{
while(pos<tot&&a[pos].len<=q[i].len)
{
Add(tr1,a[pos].l);Add(tr2,a[pos].r);
pos++;
}
q[i].ans=Sum(tr2,q[i].r)-Sum(tr1,q[i].l-1);
}
sort(q,q+qt,cmpID);
for(int i=0;i<qt;i++)
{
printf("%d\n",q[i].ans*2);
}
return 0;
}