//#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
//using namespace atcoder;
using ll = long long;
#define all(A) A.begin(),A.end()
using vll = vector<ll>;
#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
using Graph = vector<vector<pair<ll, ll>>>;
Graph G;
vll dist;
vector<bool> seen;
vll T;
vector<bool> C;
vector<bool> CHA;
//ll mod = 1e9 + 7;




int main() {
    ll N;
    cin >> N;
    vll AE(N), AO(N);
    vector<pair<ll, ll>> A(2 * N);
    vector<pair<ll, ll>> PE(N), PO(N);
    vector<char> AN(2 * N);
    rep(i, N) {
        cin >> AE[i] >> AO[i];
        A[2 * i] = make_pair(AE[i], i * 2);
        A[2 * i + 1] = make_pair(AO[i], i * 2 + 1);

    }
    sort(all(A));
    reverse(all(A));
    set<ll> BE, BO, ME, MO;
    vector<bool> B(2 * N, false);
    vector<bool> U(2 * N, false);


    rep(i, N) {
        if (A[i].second % 2 == 0) {
            BE.insert(A[i].second);
            B[A[i].second] = true;
        }
        else {
            BO.insert(A[i].second);
            B[A[i].second] = true;
        }
    }
    rep(i, N) {
        if (A[i+N].second % 2 == 0) {
            ME.insert(A[i+N].second);
        }
        else {
            MO.insert(A[i+N].second);
        }
    }
    ll i = 0;
    rep(i, 2*N) {
        if (U[i])continue;

        if (B[i]) {
            if (i % 2 == 0) {

            }
        }
    }
    while (i < 2 * N) {
        if (!U[i]) {
            if (B[i]) {
                if (i % 2 == 0) {
                    auto k = MO.begin();
                    ll n = *k;
                    MO.erase(n);
                    BE.erase(i);
                    AN[min(n, i)] = '(';
                    AN[max(n, i)] = ')';
                    U[n] = true;
                    U[i] = true;
                }
                if (i % 2 != 0) {
                    auto k = ME.begin();
                    ll n = *k;
                    ME.erase(n);
                    BO.erase(i);
                    AN[min(n, i)] = '(';
                    AN[max(n, i)] = ')';
                    U[n] = true;
                    U[i] = true;
                }
            }
            else {
                if (i % 2 == 0) {
                    auto k = BO.begin();
                    ll n = *k;
                    BO.erase(n);
                    ME.erase(i);
                    AN[min(n, i)] = '(';
                    AN[max(n, i)] = ')';
                    U[n] = true;
                    U[i] = true;
                }
                if (i % 2 != 0) {
                    auto k = BE.begin();
                    ll n = *k;
                    BE.erase(n);
                    MO.erase(i);
                    AN[min(n, i)] = '(';
                    AN[max(n, i)] = ')';
                    U[n] = true;
                    U[i] = true;
                }
            }
            
        }
        i++;
    }


    rep(i, 2 * N) {
        cout << AN[i];
    }
    cout << endl;
}

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

#define e1 first
#define e2 second
#define pb push_back
#define mp make_pair
#define boost {ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); }
#define eb emplace_back
#define OUT(x) {cout << x; exit(0); }
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define scanf(...) scanf(__VA_ARGS__)?:0
typedef long long int ll;
typedef unsigned long long ull;
typedef pair <int, int> PII;
typedef pair <ll, ll> PLL;
typedef pair <PLL, int> PLLI;
typedef pair <PII, PII> PP;
typedef pair <PII, int> PPI;
typedef pair <int, PII> PIP;
typedef pair <ll, int> PLI;
typedef unsigned int ui;
const int inf = 1e9+9;
const ll MOD = 1e9+696969;
#ifdef DEBUG
template<class T> int size(T &&x) {
	return int(x.size());
}
template<class A, class B> ostream& operator<<(ostream &out, const pair<A, B> &p) {
	return out << '(' << p.first << ", " << p.second << ')';
}
template<class T> auto operator<<(ostream &out, T &&x) -> decltype(x.begin(), out) {
	out << '{';
	for(auto it = x.begin(); it != x.end(); ++it)
		out << *it << (it == prev(x.end()) ? "" : ", ");
	return out << '}';
}
void dump() {}
template<class T, class... Args> void dump(T &&x, Args... args) {
	cerr << x << ";  ";
	dump(args...);
}
#endif
#ifdef DEBUG
  struct Nl{~Nl(){cerr << '\n';}};
# define debug(x...) cerr << (strcmp(#x, "") ? #x ":  " : ""), dump(x), Nl(), cerr << ""
#else
# define debug(...) 0 && cerr
#endif
mt19937_64 rng(0);
int random(int l, int r) {
	return uniform_int_distribution<int>(l, r)(rng);
}

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
const LL INF = 1e18;
const int maxn = 300100;
const int mod = 998244353;

void solve() {
	int n;
	cin >> n;
	vector <PII> s;
	vi pos(n+n+1, 0);
	vector <char> result(n+n+1, ')');
	
	FOR(i, 1, n+n) {
		int a;
		cin >> a;
		s.pb({a, i});
	}
	sort(all(s));
	FOR(i, 0, n+n-1) {
		pos[s[i].e2] = i + 1;
	}
	
	debug(pos);
	vector <PII> stos;
	
	FOR(i, 1, n+n) {
		int typ = ((pos[i] <= n) ? 0 : 1);
		if (stos.empty() || stos.back().e2 == typ) {
			stos.pb({i, typ});
		}
		else {
			result[stos.back().e1] = '(';
			result[i] = ')';
			stos.pop_back();
		}
	}
	
	FOR(i, 1, n+n) cout << result[i];
	cout << "\n";	
}

int main() {
	boost;
	int tests;
	tests = 1;
	//cin >> tests;
	while (tests--) {
		solve();
	}
}

