Language: C++

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <utility>
#include <functional>
#define rep(i,n) for(int i=0;i<n;++i)
#define rep1(i,n) for(int i=1;i<=n;++i)
using namespace std;
template<class T>bool chmax(T &a, const T &b) { if(a < b){ a = b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if(a > b){ a = b; return 1; } return 0; }
template <typename T>
struct SegTree{
  // 二項演算merge,単位元identify
  using F = function<T(T, T)>;
  T identity;
  F merge; 
  int size;
  vector<T> dat;
  
  // 二項演算fと単位元idを渡して宣言する
  SegTree(F f,T id):merge(f),identity(id){}

  // データの要素の数nを渡して初期化、sizeはnより大きい2の冪乗
  void init(int n){
    size = 1;
    while(size<=n) size *= 2;
    dat.resize(size*2-1,identity);
  }

  // 配列を渡して0(n)で初期化
  void build(vector<T> vec){
    rep(i,vec.size()) dat[size-1+i] = vec[i];
    dfs(0);
  }
  
  T dfs(int k){
    if(k>=size-1) return dat[k];
    else return dat[k] = merge(dfs(2*k+1),dfs(2*k+2));
  }

  // index kの要素をaに変更
  void update(int k,T a){
    k += size - 1;
    dat[k] = a;
    while(k > 0){
      k = (k-1)/2;
      dat[k] = merge(dat[2*k+1],dat[2*k+2]);
    }
  }

  // 区間[a,b)に対するクエリに答える。(k,l,r)=(0,0,size)
  T query(int a,int b,int k,int l,int r){
    if(r<=a||b<=l) return identity;
    
    if(a<=l&&r<=b) return dat[k]; 
    else return merge(query(a,b,2*k+1,l,(l+r)/2),query(a,b,2*k+2,(l+r)/2,r));
  }
  
  void show(){
    int index = 0;
    int num = 1;
    while(index<size){
      rep(i,num){
	if(dat[i+index]==identity) cout << "e ";
	else cout << dat[i+index] << " ";
      }
      cout << "\n";
      num *= 2;
      index = index*2+1;
    }
  }
  
};

bool comp(pair<int,int> &a, pair<int,int> &b) {
  return a.second < b.second;
}

int main()
{
  int n;cin >> n;
  vector<string> s(n);
  rep(i,n) cin >> s[i];
  {
    vector<pair<int,int>> p(n);
    int sum = 0;
    rep(i,n) {
      int a = 0;
      int b = 0;
      rep(j,(int)s[i].size()) {
	if(s[i][j] == '(') a++;
	else a--;
	chmin(b, a);
      }
      p[i] = {a, b};
      sum += a;
    }
    if(sum != 0) {
      cout << "No" << "\n";
      return 0;
    }
    
    sort(p.begin(), p.end(), comp);

    auto f = [&](pair<int,int> c, pair<int,int> d)->pair<int,int> {
								   if(c.first >= d.first) return c;
								   else return d;
    };
    pair<int,int> id = {-1e+9, n};
    SegTree<pair<int,int>> seg(f,id);
    vector<pair<int,int>> vec(n);
    rep(i,n) {
      vec[i] = {p[i].first, i};
    }
    seg.init(n+1);
    seg.build(vec);

    vector<int> bb(n);
    rep(i,n) bb[i] = p[i].second;

    int sum = 0;
    rep(i,n) {
      int lb = -1, ub = bb.size();
      while(ub - lb > 1) {
	int mid = (ub + lb)/2;
	if(sum + bb[mid] >= 0) ub = mid;
	else lb = mid;
      }
      if(ub == (int)bb.size()) {
	cout << "No" << "\n";
	return 0;
      }
    
      pair<int,int> tmp = seg.query(ub, seg.size, 0, 0, seg.size);
      sum += tmp.first;
      if(sum < -1e+6) {
	cout << "No" << "\n";
	return 0;
      }
      seg.update(tmp.second, id);
      
    }

    if(sum == 0) {
      cout << "Yes" << "\n";
      return 0;
    }
  }
  {
    int sum = 0;
    vector<pair<int,int>> p(n);
    rep(i,n) {
      int a = 0;
      int b = 0;
      for(int j = s[i].size()-1; j >= 0; --j) {
	if(s[i][j] == ')') a++;
	else a--;
	chmin(b, a);
      }
      p[i] = {a, b};
      sum += a;
    }
    if(sum != 0) {
      cout << "No" << "\n";
      return 0;
    }
    
    sort(p.begin(), p.end(), comp);

    //  rep(i,n) cout << p[i].first << ":" << p[i].second << "\n";
    auto f = [&](pair<int,int> c, pair<int,int> d)->pair<int,int> {
								   if(c.first >= d.first) return c;
								   else return d;
    };
    pair<int,int> id = {-1e+9, n};
    SegTree<pair<int,int>> seg(f,id);
    vector<pair<int,int>> vec(n);
    rep(i,n) {
      vec[i] = {p[i].first, i};
    }
    seg.init(n+1);
    seg.build(vec);

    vector<int> bb(n);
    rep(i,n) bb[i] = p[i].second;

    int sum = 0;
    rep(i,n) {
      int lb = -1, ub = bb.size();
      while(ub - lb > 1) {
	int mid = (ub + lb)/2;
	if(sum + bb[mid] >= 0) ub = mid;
	else lb = mid;
      }
      if(ub == (int)bb.size()) {
	cout << "No" << "\n";
	return 0;
      }
    
      pair<int,int> tmp = seg.query(ub, seg.size, 0, 0, seg.size);
      sum += tmp.first;
      if(sum < -1e+6) {
	cout << "No" << "\n";
	return 0;
      }      
      seg.update(tmp.second, id);
      //    cout << sum << "\n";
    }

    if(sum == 0) {
      cout << "Yes" << "\n";
      return 0;
    }
  }
  cout << "No" << "\n";
}


Compiler output:
a.cc: In function 'int main()':
a.cc:122:9: error: redeclaration of 'int sum'
  122 |     int sum = 0;
      |         ^~~
a.cc:87:9: note: 'int sum' previously declared here
   87 |     int sum = 0;
      |         ^~~
a.cc:188:9: error: redeclaration of 'int sum'
  188 |     int sum = 0;
      |         ^~~
a.cc:151:9: note: 'int sum' previously declared here
  151 |     int sum = 0;
      |         ^~~