BRCKTS - Brackets - SPOJ Solution C++

  Problem Link : BRCKTS 


👉 Hint : edit please

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;

#define ll long long int
#define mp make_pair

pair<int,int> st[400001];
char arr[100001];
void build(int v, int l, int r)
{
	if(l==r)
	{
		if(arr[l]=='(')
			st[v]=mp(1,0);
		else
			st[v]=mp(0,1);
		return ;
	}

	int mid=(l+r)/2;
	build(2*v,l,mid);
	build(2*v+1,mid+1,r);

	st[v].first=st[2*v+1].first;
	st[v].second=st[2*v].second;
	int val=st[2*v].first - st[2*v+1].second;
	if(val>0)
		st[v].first+=val;
	else
		st[v].second+=abs(val);

}

void update(int v, int l,int r,int ind)
{
	if(l==r)
	{
		if(st[v].first==1)
		{
			st[v].first=0;
			st[v].second=1;
		}
		else
		{
			st[v].second=0;
			st[v].first=1;
		}
		return;
	}

	int mid=(l+r)/2;

	if(ind>=l && ind<=mid)
		update(2*v,l,mid,ind);
	else
		update(2*v+1,mid+1,r,ind);

	st[v].first=st[2*v+1].first;
	st[v].second=st[2*v].second;
	int val=st[2*v].first - st[2*v+1].second;
	if(val>0)
		st[v].first+=val;
	else
		st[v].second+=abs(val);

}

string query()
{
   // cout<<st[1].first<<" "<<st[1].second<<endl;
	if(st[1].first==0 && st[1].second==0)
		return "YES\n";
	return "NO\n";

}


int main()
{
	for(int i=1;i<=10;i++)
	{
		int n,m,x;
		cin>>n;

		for(int i=1;i<=n;i++)
			cin>>arr[i];

		build(1,1,n);
		cout<<"Test "<<i<<":\n";
		cin>>m;
		while(m--)
		{
			cin>>x;
			if(x==0)
				cout<<query();
			else
				update(1,1,n,x);
		}
	}

}
				

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!