Problem:
Score : 600 points

Problem Statement

A bracket sequence is a string that is one of the following:

An empty string;

The concatenation of (, A, and ) in this order, for some bracket sequence A ;

The concatenation of A and B in this order, for some non-empty bracket sequences A and B /

Given are N strings S_i. Can a bracket sequence be formed by concatenating all the N strings in some order?

Constraints

1 \leq N \leq 10^6

The total length of the strings S_i is at most 10^6.

S_i is a non-empty string consisting of ( and ).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

If a bracket sequence can be formed by concatenating all the N strings in some order, print Yes; otherwise, print No.

Sample Input 1

2
)
(()

Sample Output 1

Yes

Concatenating (() and ) in this order forms a bracket sequence.

Sample Input 2

2
)(
()

Sample Output 2

No

Sample Input 3

4
((()))
((((((
))))))
()()()

Sample Output 3

Yes

Sample Input 4

3
(((
)
)

Sample Output 4

No

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
int n,a,b,A,B;
string s;
vector<pair<int,int> >v;
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>s;
        int l=0,r=0;
        for(int i=0;i<s.size();i++)
            if(s[i]=='(') r++;
        else
        {
            if(r) r--;
            else l++;
        }
        if(l&&r) v.push_back({r,l}),a+=l,b+=r;
        else if(l) A+=l;
        else if(r) B+=r;
    }
    bool flag=false;
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++)
    {
        pair<int,int>x=v[i];
        int r=x.first,l=x.second,la=a-l,lb=b-r;
        if(l>B) continue;
        int xx=r+lb-la-(B-l),yy=max(A,r+lb-la);
        //cout<<l<<' '<<r<<' '<<xx<<' '<<yy<<' '<<la<<' '<<lb<<endl;
        int pos=lower_bound(v.begin(),v.end(),make_pair(xx,0))-v.begin();
        if(pos==i) pos++;
        if(pos<v.size()&&v[pos].first>=xx&&v[pos].first<=yy)
        {
         //   cout<<v[pos].first<<endl;
            flag=true;
            break;
        }
    }
    if(flag)
        printf("Yes\n");
    else printf("No\n");
}
/*
6
)))((((
))))(((
))))((
))((((
))
((


))))((((
))
((
*/