Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- /*
- Bismillahir Rahmanir Rahim
- Problem : BRCKTS - Bracketss
- Problem Link : https://www.spoj.com/problems/BRCKTS/
- Topics : Simple Segment Tree
- Solver : Masud Parves
- I Love Code More than Sharks Love Blood <3
- */
- #define ff first
- #define ss second
- #define pb push_back
- #define mp make_pair
- #define all(a) a.begin(), a.end()
- #define sf(a) scanf("%d",&a)
- #define sff(a,b) scanf("%d%d",&a,&b)
- #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
- #define f0(i,b) for(int i=0;i<(b);i++)
- #define f1(i,b) for(int i=1;i<=(b);i++)
- #define f2(i,a,b) for(int i=(a);i<=(b);i++)
- #define fr(i,b,a) for(int i=(b);i>=(a);i--)
- #define CIN ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
- #define TEST_CASE(t) for(int z=1 ; z<=t ; z++)
- #define PRINT_CASE printf("Test %d:\n",z)
- #define NOT_VISITED 0
- #define IS_VISITED 1
- int fx[4]= {1,-1,0,0};
- int fy[4]= {0,0,1,-1};
- const double PI = acos(-1.0);
- const double EPS = 1e-6;
- const int MOD = (int)1e9+7;
- const int maxn = (int)2e5+5;
- const int mx = (int)30000+5;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef vector<int> vi;
- typedef pair<int, int> pii;
- typedef pair<ll, int> plli;
- typedef pair<int, ll> pill;
- char ch[mx];
- struct segment
- {
- int cntOpenBracket,cntCloseBracket;
- } tree[4*mx];
- void BuildTree(int node, int b, int e )
- {
- if(b==e)
- {
- if(ch[b]=='(')
- {
- tree[node].cntOpenBracket = 1;
- tree[node].cntCloseBracket = 0;
- }
- else
- {
- tree[node].cntOpenBracket = 0;
- tree[node].cntCloseBracket = 1;
- }
- return;
- }
- int mid=(b+e)/2,left=node*2,right=left+1;
- BuildTree(left, b, mid);
- BuildTree(right, mid+1, e);
- int match=min(tree[left].cntOpenBracket,tree[right].cntCloseBracket);
- tree[node].cntOpenBracket=(tree[left].cntOpenBracket+tree[right].cntOpenBracket)-match;
- tree[node].cntCloseBracket=(tree[left].cntCloseBracket+tree[right].cntCloseBracket)-match;
- }
- void update(int node, int b, int e, int idx, char newvalue)
- {
- if (idx > e || idx < b)
- return;
- if (b >= idx && e <= idx)
- {
- if(newvalue=='(')
- {
- tree[node].cntOpenBracket=1;
- tree[node].cntCloseBracket=0;
- }
- else
- {
- tree[node].cntOpenBracket=0;
- tree[node].cntCloseBracket=1;
- }
- return;
- }
- int mid=(b+e)/2,left=node*2,right=left+1;
- update(left, b, mid, idx, newvalue);
- update(right, mid + 1, e, idx, newvalue);
- int match=min(tree[left].cntOpenBracket,tree[right].cntCloseBracket);
- tree[node].cntOpenBracket=(tree[left].cntOpenBracket+tree[right].cntOpenBracket)-match;
- tree[node].cntCloseBracket=(tree[left].cntCloseBracket+tree[right].cntCloseBracket)-match;
- }
- segment Query(int node, int b, int e, int l, int r)
- {
- if(b>e || b>r || e<l)
- {
- segment res;
- res.cntCloseBracket=0;
- res.cntOpenBracket=0;
- return res;
- }
- if(b>=l && e<=r)
- {
- return tree[node];
- }
- int mid=(b+e)/2,left=node*2,right=left+1;
- segment lft,rgt,result;
- lft=Query(left, b, mid, l, r);
- rgt=Query(right, mid+1, e, l, r);
- int match=min(lft.cntOpenBracket,rgt.cntCloseBracket);
- result.cntOpenBracket=(lft.cntOpenBracket+rgt.cntOpenBracket)-match;
- result.cntCloseBracket=(lft.cntCloseBracket+rgt.cntCloseBracket)-match;
- return result;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- int n,q,val;
- int t=10;
- TEST_CASE(t)
- {
- cin>>n;
- cin>>ch;
- cin>>q;
- BuildTree(1,0,n-1);
- PRINT_CASE;
- while(q--)
- {
- cin>>val;
- if(val)
- {
- char up;
- if(ch[val-1]=='(')
- {
- up=')';
- }
- else
- {
- up='(';
- }
- update(1,0,n-1,val-1,up);
- }
- else
- {
- segment result=Query(1,0,n-1,0,n-1);
- if(result.cntOpenBracket==0 && result.cntCloseBracket==0)
- cout<<"YES\n";
- else
- cout<<"NO\n";
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement