完全不知道错在哪里了,希望大佬能指点一下,只要是涉及到修改查询就全错,但是明明样例也过了
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n, q;
constexpr int N = 5e5 + 10;
struct info {
int Lcnt, Rcnt, match;
};
struct node{
info preinfo, reveinfo;
}tree[N<<2];
bool tag[N<<2];
char buff[N];
void lazy(int i)
{
tag[i] = 1;
swap(tree[i].preinfo, tree[i].reveinfo);
}
void push_down(int i)
{
if(!tag[i])
return;
lazy(i << 1);
lazy(i << 1 | 1);
tag[i] = 0;
}
info merge(info & a1 ,info &a2)
{
int new_match = min(a1.Lcnt, a2.Rcnt);
return info{a1.Lcnt + a2.Lcnt - new_match, a1.Rcnt + a2.Rcnt - new_match, a1.match + new_match + a2.match};
}
info query(int jl,int jr,int l,int r,int i)
{
if(jl<=l&&jr>=r) {
return tree[i].preinfo;
}
push_down(i);
int mid = l + r >> 1;
if(jr<=mid)
return query(jl, jr, l, mid, i << 1);
else if(jl>mid)
return query(jl, jr, mid + 1, r, i << 1 | 1);
info ans1 = query(jl, jr, l, mid, i << 1);
info ans2 = query(jl, jr, mid + 1, r, i << 1 | 1);
return merge(ans1, ans2);
}
void push_up(info &pa,info &lson,info &rson)
{
pa = merge(lson, rson);
}
void update(int jl,int jr,int l,int r,int i)
{
if(jl<=l&&jr>=r)
{
lazy(i);
return;
}
push_down(i);
int mid = l + r >> 1;
if(jl<=mid)
update(jl, jr, l, mid, i << 1);
if(jr>mid)
update(jl, jr, mid + 1, r,i << 1 | 1);
push_up(tree[i].preinfo, tree[i << 1].preinfo, tree[i << 1 | 1].preinfo);
push_up(tree[i].reveinfo, tree[i << 1].reveinfo, tree[i << 1 | 1].reveinfo);
}
void build(int l,int r,int i)
{
if(l==r)
{
if(buff[l]=='(')
{
tree[i] = {1, 0, 0, 0, 1, 0};
}
else {
tree[i] = {0, 1, 0, 1, 0, 0};
}
return;
}
int mid = l + r >> 1;
build(l, mid, i << 1);
build(mid + 1, r, i << 1 | 1);
push_up(tree[i].preinfo, tree[i << 1].preinfo, tree[i << 1 | 1].preinfo);
push_up(tree[i].reveinfo, tree[i << 1].reveinfo, tree[i << 1 | 1].reveinfo);
}
int main()
{
scanf("%d\n", &n);
scanf("%s", buff + 1);
scanf("%d", &q);
build(1, n, 1);
int op, L, R;
for (int i = 0; i < q;++i)
{
scanf("%d %d %d", &op, &L, &R);
if(op==2)
{
printf("%d\n", query(L,R,1,n,1).match);
}
else {
update(L, R, 1, n, 1);
}
}
return 0;
}