-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBRCKTS.cpp
More file actions
78 lines (73 loc) · 1.7 KB
/
Copy pathBRCKTS.cpp
File metadata and controls
78 lines (73 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <string>
using namespace std;
struct node{
int open, close;
};
node merge(node left, node right){
node parent;
parent.open=left.open+right.open-min(left.open, right.close);
parent.close=left.close+right.close-min(left.open, right.close);
return parent;
}
void build_tree(node seg_tree[], string bracket_word, int i, int s, int e){
if(s==e){
if(bracket_word[s]=='('){
seg_tree[i].open=1;
seg_tree[i].close=0;
}
else{
seg_tree[i].open=0;
seg_tree[i].close=1;
}
return;
}
build_tree(seg_tree, bracket_word, 2*i+1, s, (s+e)/2);
build_tree(seg_tree, bracket_word, 2*i+2, ((s+e)/2)+1, e);
seg_tree[i]=merge(seg_tree[2*i+1], seg_tree[2*i+2]);
}
void update(node seg_tree[], char value, int k, int i, int s, int e){
if(s==e){
if(value=='('){
seg_tree[i].open=1;
seg_tree[i].close=0;
}
else{
seg_tree[i].open=0;
seg_tree[i].close=1;
}
return;
}
if(k<=(s+e)/2)
update(seg_tree, value, k, 2*i+1, s, (s+e)/2);
else
update(seg_tree, value, k, 2*i+2, ((s+e)/2)+1, e);
seg_tree[i]=merge(seg_tree[2*i+1], seg_tree[2*i+2]);
}
int main(){
int t, n, m, k;
string bracket_word;
for(t=1; t<=10; t++){
cin>>n>>bracket_word>>m;
node seg_tree[4*n];
build_tree(seg_tree, bracket_word, 0, 0, n-1);
cout<<"Test "<<t<<":\n";
while(m--){
cin>>k;
if(k==0){
if(seg_tree[0].open==0 && seg_tree[0].close==0)
cout<<"YES\n";
else
cout<<"NO\n";
}
else{
if(bracket_word[k-1]=='(')
update(seg_tree, ')', k-1, 0, 0, n-1);
else
update(seg_tree, '(', k-1, 0, 0, n-1);
bracket_word[k-1]=(bracket_word[k-1]=='(')?')':'(';
}
}
}
return 0;
}