Advertisement
Guest User

Untitled

a guest
Sep 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. /*
  6.  
  7. Bismillahir Rahmanir Rahim
  8. Problem : BRCKTS - Bracketss
  9. Problem Link : https://www.spoj.com/problems/BRCKTS/
  10. Topics : Simple Segment Tree
  11. Solver : Masud Parves
  12. I Love Code More than Sharks Love Blood <3
  13. */
  14.  
  15.  
  16. #define ff first
  17. #define ss second
  18. #define pb push_back
  19. #define mp make_pair
  20. #define all(a) a.begin(), a.end()
  21.  
  22.  
  23. #define sf(a) scanf("%d",&a)
  24. #define sff(a,b) scanf("%d%d",&a,&b)
  25. #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
  26.  
  27. #define f0(i,b) for(int i=0;i<(b);i++)
  28. #define f1(i,b) for(int i=1;i<=(b);i++)
  29. #define f2(i,a,b) for(int i=(a);i<=(b);i++)
  30. #define fr(i,b,a) for(int i=(b);i>=(a);i--)
  31.  
  32. #define CIN ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
  33. #define TEST_CASE(t) for(int z=1 ; z<=t ; z++)
  34. #define PRINT_CASE printf("Test %d:\n",z)
  35. #define NOT_VISITED 0
  36. #define IS_VISITED 1
  37.  
  38.  
  39.  
  40. int fx[4]= {1,-1,0,0};
  41. int fy[4]= {0,0,1,-1};
  42.  
  43.  
  44. const double PI = acos(-1.0);
  45. const double EPS = 1e-6;
  46. const int MOD = (int)1e9+7;
  47. const int maxn = (int)2e5+5;
  48. const int mx = (int)30000+5;
  49.  
  50. typedef long long ll;
  51. typedef unsigned long long ull;
  52. typedef vector<int> vi;
  53. typedef pair<int, int> pii;
  54. typedef pair<ll, int> plli;
  55. typedef pair<int, ll> pill;
  56.  
  57. char ch[mx];
  58.  
  59. struct segment
  60. {
  61.  
  62. int cntOpenBracket,cntCloseBracket;
  63.  
  64. } tree[4*mx];
  65.  
  66.  
  67. void BuildTree(int node, int b, int e )
  68. {
  69. if(b==e)
  70. {
  71. if(ch[b]=='(')
  72. {
  73. tree[node].cntOpenBracket = 1;
  74. tree[node].cntCloseBracket = 0;
  75. }
  76. else
  77. {
  78. tree[node].cntOpenBracket = 0;
  79. tree[node].cntCloseBracket = 1;
  80. }
  81. return;
  82. }
  83.  
  84. int mid=(b+e)/2,left=node*2,right=left+1;
  85.  
  86. BuildTree(left, b, mid);
  87. BuildTree(right, mid+1, e);
  88.  
  89. int match=min(tree[left].cntOpenBracket,tree[right].cntCloseBracket);
  90. tree[node].cntOpenBracket=(tree[left].cntOpenBracket+tree[right].cntOpenBracket)-match;
  91. tree[node].cntCloseBracket=(tree[left].cntCloseBracket+tree[right].cntCloseBracket)-match;
  92. }
  93.  
  94.  
  95. void update(int node, int b, int e, int idx, char newvalue)
  96. {
  97. if (idx > e || idx < b)
  98. return;
  99. if (b >= idx && e <= idx)
  100. {
  101.  
  102. if(newvalue=='(')
  103. {
  104. tree[node].cntOpenBracket=1;
  105. tree[node].cntCloseBracket=0;
  106. }
  107. else
  108. {
  109. tree[node].cntOpenBracket=0;
  110. tree[node].cntCloseBracket=1;
  111. }
  112. return;
  113. }
  114. int mid=(b+e)/2,left=node*2,right=left+1;
  115.  
  116. update(left, b, mid, idx, newvalue);
  117. update(right, mid + 1, e, idx, newvalue);
  118.  
  119. int match=min(tree[left].cntOpenBracket,tree[right].cntCloseBracket);
  120. tree[node].cntOpenBracket=(tree[left].cntOpenBracket+tree[right].cntOpenBracket)-match;
  121. tree[node].cntCloseBracket=(tree[left].cntCloseBracket+tree[right].cntCloseBracket)-match;
  122.  
  123. }
  124.  
  125. segment Query(int node, int b, int e, int l, int r)
  126. {
  127. if(b>e || b>r || e<l)
  128. {
  129. segment res;
  130. res.cntCloseBracket=0;
  131. res.cntOpenBracket=0;
  132. return res;
  133. }
  134.  
  135. if(b>=l && e<=r)
  136. {
  137. return tree[node];
  138. }
  139.  
  140. int mid=(b+e)/2,left=node*2,right=left+1;
  141.  
  142. segment lft,rgt,result;
  143.  
  144.  
  145. lft=Query(left, b, mid, l, r);
  146. rgt=Query(right, mid+1, e, l, r);
  147.  
  148.  
  149. int match=min(lft.cntOpenBracket,rgt.cntCloseBracket);
  150. result.cntOpenBracket=(lft.cntOpenBracket+rgt.cntOpenBracket)-match;
  151. result.cntCloseBracket=(lft.cntCloseBracket+rgt.cntCloseBracket)-match;
  152. return result;
  153. }
  154.  
  155.  
  156. int main()
  157. {
  158. ios::sync_with_stdio(false);
  159.  
  160. int n,q,val;
  161. int t=10;
  162. TEST_CASE(t)
  163. {
  164. cin>>n;
  165. cin>>ch;
  166. cin>>q;
  167. BuildTree(1,0,n-1);
  168. PRINT_CASE;
  169. while(q--)
  170. {
  171. cin>>val;
  172. if(val)
  173. {
  174. char up;
  175. if(ch[val-1]=='(')
  176. {
  177. up=')';
  178. }
  179. else
  180. {
  181. up='(';
  182. }
  183. update(1,0,n-1,val-1,up);
  184. }
  185. else
  186. {
  187. segment result=Query(1,0,n-1,0,n-1);
  188. if(result.cntOpenBracket==0 && result.cntCloseBracket==0)
  189. cout<<"YES\n";
  190. else
  191. cout<<"NO\n";
  192. }
  193. }
  194. }
  195. return 0;
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement