Educational Codeforces Round 102 (Rated for Div. 2) D. Program
预处理之后再计算,需计算出第l个运算符之前的最大、最小值,第r个运算符之后的最大、最小值以及各个运算符计算出的值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 2e5+50;
int pmax[maxn],pmin[maxn],up[maxn],down[maxn],c[maxn];
void solve(){
string s;
int n,m;
cin>>n>>m;
cin>>s;
pmax[0]=0;
pmin[0]=0;
int cur=0;
c[0]=0;
for(int i=0;i<n;i++)
{
if(s[i]=='+')
cur++;
else
cur--;
c[i+1]=cur;
pmax[i+1]=max(pmax[i],cur);
pmin[i+1]=min(pmin[i],cur);
}
up[n]=-INT_MIN;
down[n]=INT_MAX;
for(int i=n;i>0;i--)
{
up[i-1]=max(up[i],c[i]);
down[i-1]=min(down[i],c[i]);
}
while(m--)
{
int l,r;
cin>>l>>r;
int anst=max(pmax[l-1],c[l-1]+up[r-1]-c[r]);
int ansb=min(pmin[l-1],c[l-1]+down[r-1]-c[r]);
cout<<anst-ansb+1<<endl;
}
}
int main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}