这题掉了一句话,调了N久~~~
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 100010;
int setv[MAXN<<2], XOR[MAXN<<2], sum[MAXN<<2], maxv[MAXN<<2], minv[MAXN<<2];
int val[MAXN];
char str[MAXN];
void PushUp(int rt)
{
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
maxv[rt] = max(maxv[rt<<1], sum[rt<<1] + maxv[rt<<1|1]);
minv[rt] = min(minv[rt<<1], sum[rt<<1] + minv[rt<<1|1]);
}
void PushDown(int rt, int l, int r)
{
int m = (l + r)>>1;
if(setv[rt] != 0)
{
setv[rt<<1] = setv[rt<<1|1] = setv[rt];
XOR[rt<<1] = XOR[rt<<1|1] = 0;
sum[rt<<1] = (m - l + 1) * setv[rt];
sum[rt<<1|1] = (r - m) * setv[rt];
maxv[rt<<1] = max(-1, setv[rt]*(m-l+1));
minv[rt<<1] = min(1, setv[rt]*(m-l+1));
maxv[rt<<1|1] = max(-1, setv[rt]*(r-m));
minv[rt<<1|1] = min(1, (r-m)*setv[rt]);
setv[rt] = 0; ///
}
if(XOR[rt])
{
if(setv[rt<<1] != 0)
setv[rt<<1] = -setv[rt<<1];
else
XOR[rt<<1] ^= 1;
if(setv[rt<<1|1] != 0)
setv[rt<<1|1] = -setv[rt<<1|1];
else
XOR[rt<<1|1] ^= 1;
sum[rt<<1] = -sum[rt<<1];
sum[rt<<1|1] = -sum[rt<<1|1];
int temp;
temp = minv[rt<<1];
minv[rt<<1] = -maxv[rt<<1];
maxv[rt<<1] = -temp;
temp = minv[rt<<1|1];
minv[rt<<1|1] = -maxv[rt<<1|1];
maxv[rt<<1|1] = -temp;
XOR[rt] = 0;
}
return ;
}
void Bulid(int l, int r, int rt)
{
setv[rt] = 0;
XOR[rt] = 0;
if(l == r)
{
sum[rt] = val[l];
maxv[rt] = val[l];
minv[rt] = val[l];
return ;
}
int m = (l + r)>>1;
Bulid(l, m, rt<<1);
Bulid(m + 1, r, rt<<1|1);
PushUp(rt);
return ;
}
void Update(int L, int R, int op, int l, int r, int rt)
{
if(L == l && R == r)
{
if(op == 1)
{
setv[rt] = -1;
XOR[rt] = 0;
sum[rt] = -(r - l + 1);
maxv[rt] = -1;
minv[rt] = -(r - l + 1);
}
else if(op == 2)
{
setv[rt] = 1;
XOR[rt] = 0;
sum[rt] = (r - l + 1);
maxv[rt] = (r - l + 1);
minv[rt] = 1;
}
else if(op == 3)
{
if(setv[rt] != 0)
setv[rt] = -setv[rt];
else
XOR[rt] ^= 1;
sum[rt] = -sum[rt];
int temp = minv[rt];
minv[rt] = -maxv[rt];
maxv[rt] = -temp;
}
return ;
}
PushDown(rt, l, r);
int m = (l + r)>>1;
if(R <= m)
Update(L, R, op, l, m, rt<<1);
else if(L > m)
Update(L, R, op, m + 1, r, rt<<1|1);
else
{
Update(L, m, op, l, m, rt<<1);
Update(m + 1, R, op, m + 1, r, rt<<1|1);
}
PushUp(rt);
return ;
}
void Query(int L, int R, int l, int r, int rt, int &s, int &maxval)
{
if(L == l && R == r)
{
s = sum[rt]; maxval = maxv[rt];
return ;
}
PushDown(rt, l, r);
int m = (l + r)>>1;
if(R <= m)
Query(L, R, l, m, rt<<1, s, maxval);
else if(L > m)
Query(L, R, m + 1, r, rt<<1|1, s, maxval);
else
{
int ts1, tmaxval1, ts2, tmaxval2;
Query(L, m, l, m, rt<<1, ts1, tmaxval1);
Query(m + 1, R, m + 1, r, rt<<1|1, ts2, tmaxval2);
s = ts1 + ts2;
maxval = max(tmaxval1, ts1 + tmaxval2);
return ;
}
}
int main()
{
//freopen("aa.in", "r", stdin);
int T, n, m; int s, maxval, kcase = 0;
char op[10]; int a, b; char ch;
scanf("%d", &T);
while(T--)
{
kcase++;
scanf("%d", &n);
scanf("%s", str + 1);
for(int i = 1; i <= n; ++i)
{
if(str[i] == '(') val[i] = -1;
if(str[i] == ')') val[i] = 1;
}
printf("Case %d:\n", kcase);
Bulid(1, n, 1);
scanf("%d", &m);
while(m--)
{
scanf("%s", op);
if(op[0] == 's')
{
scanf("%d %d %c", &a, &b, &ch);
Update(a + 1, b + 1, (ch == '(' ? 1 : 2), 1, n, 1);
}
if(op[0] == 'r')
{
scanf("%d %d", &a, &b);
Update(a + 1, b + 1, 3, 1, n, 1);
}
if(op[0] == 'q')
{
scanf("%d %d", &a, &b);
Query(a + 1, b + 1, 1, n, 1, s, maxval);
if(s == 0 && maxval <= 0)
printf("YES\n");
else
printf("NO\n");
}
}
printf("\n");
}
return 0;
}