Guest User

BRCKTS

a guest
May 4th, 2014
1,304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. // logic_max
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <assert.h>
  5. #include <string>
  6. #include <cstring>
  7. #include <map>
  8. #include <set>
  9. #include <vector>
  10. #include <iostream>
  11. #include <queue>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <climits>
  15. #include <iomanip>
  16. #include <sstream>
  17. using namespace std;
  18.  
  19. typedef long long LL;
  20. #define tr(container, it)for(__typeof(container.begin()) it = container.begin(); it != container.end(); it++)
  21. #define PB push_back
  22. #define MP make_pair
  23. #define REP(i,a,b) for (int i = (a); i < (int)(b); i++)
  24.  
  25. int GCD (int a, int b) { if (!a) return b; return GCD(b%a, a);}
  26.  
  27. #define X 30009
  28. char str[X];
  29.  
  30. struct node {
  31. int close, open;
  32. node():close(0),open(0){}
  33. void init(char s) {
  34. if (s == '(') open = 1, close = 0;
  35. else close = 1, open = 0;
  36. }
  37. void merge(const node &l, const node &r) {
  38. int mi = min(l.open, r.close);
  39. open = l.open - mi + r.open;
  40. close = l.close + r.close - mi;
  41. }
  42. }tree[4*X];
  43.  
  44. void build(int root, int s, int e) {
  45. if (s == e) {
  46. tree[root].init(str[s]);
  47. return;
  48. }
  49. int mid = (s + e)/2;
  50. build(root*2, s, mid);
  51. build(root*2+1, mid+1, e);
  52. tree[root].merge(tree[root*2], tree[root*2+1]);
  53. }
  54.  
  55. void update(int root, int s, int e, int pos) {
  56. if (s == e) {
  57. if (str[s] == '(') str[s] = ')';
  58. else str[s] = '(';
  59. tree[root].init(str[s]);
  60. return;
  61. }
  62. int mid = (s + e)/2;
  63. if (pos >= s && pos <= mid) update(root*2, s, mid, pos);
  64. else update(root*2+1, mid+1, e, pos);
  65. tree[root].merge(tree[root*2], tree[root*2+1]);
  66. }
  67.  
  68. int main() {
  69. clock_t startTime = clock();
  70. ios_base::sync_with_stdio(false);
  71.  
  72. int test = 10;
  73. while (test--) {
  74. int n; scanf("%d", &n);
  75. scanf("%s", str);
  76. build(1, 0, n-1);
  77. int m; scanf("%d", &m);
  78. printf("Test %d:\n", 10-test);
  79. while(m--) {
  80. int q; scanf("%d", &q);
  81. if (!q) {
  82. int ans = !tree[1].close && !tree[1].open;
  83. if (ans) puts("YES");
  84. else puts("NO");
  85. } else {
  86. --q;
  87. update(1, 0, n-1, q);
  88. }
  89. }
  90. }
  91.  
  92. clock_t endTime = clock();
  93. cerr<<"\nTime:"<< double(endTime - startTime) / CLOCKS_PER_SEC <<" seconds\n" ;
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment