題目鏈接添加鏈接描述
典型線段樹,單點修改,區間維護。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+1;
char str[maxn];
int sum[4*maxn], mi[4*maxn];
void modify(int o, int x, int l, int r, int lr) {
if (l == r) {
sum[o] = mi[o] = x;
return ;
}
int mid = l + r >> 1;
if (mid >= lr) modify(o<<1,x,l,mid,lr);
else modify(o<<1|1,x,mid+1,r,lr);
sum[o] = sum[o<<1] + sum[o<<1|1];
mi[o] = min(mi[o<<1], sum[o<<1] + mi[o<<1|1]);
}
int main() {
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++ i) {
cin >> str[i];
if (str[i] == '(') modify(1,1,1,n,i);
else modify(1,-1,1,n,i);
}
while(m--) {
int d;
cin >> d;
if (str[d] == '(') str[d] = ')', modify(1,-1,1,n,d);
else str[d] = '(', modify(1,1,1,n,d);
// cout << sum[1] << " " << mi[1] << endl;
if (sum[1] == 0 && mi[1] >= 0) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}