#include <bits/stdc++.h>
using namespace std;
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return __builtin_popcountll(s);
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
string res;
int n;
int l[1005], r[1005];
bool can[1005][1005];
void go(int lo, int hi) {
  if (lo == hi) {
    res += "()";
    return;
  }
  if (l[lo] <= hi - lo + 1 && hi - lo + 1 <= r[lo] && can[lo + 1][hi]) {
    res += "(";
    go(lo + 1, hi);
    res += ")";
    return;
  }
  for (int i = lo + 1; i <= hi; i++)
    if (can[lo][i - 1] && can[i][hi]) {
      go(lo, i - 1);
      go(i, hi);
      return;
    }
}
int main() {
  memset(can, 0, sizeof(can));
  cin >> n;
  for (int i = (1); i <= (n); ++i) {
    cin >> l[i] >> r[i];
    l[i] = l[i] / 2 + 1;
    r[i] = (r[i] + 1) / 2;
  }
  for (int i = (1); i <= (n); ++i)
    if (l[i] > r[i]) {
      cout << "IMPOSSIBLE";
      return 0;
    }
  for (int i = (1); i <= (n); ++i) {
    if (l[i] == 1) can[i][i] = 1;
  }
  for (int add = (1); add <= (n - 1); ++add)
    for (int i = (1); i <= (n - add); ++i) {
      int j = i + add;
      if (can[i + 1][j] && l[i] <= add + 1 && add + 1 <= r[i]) can[i][j] = 1;
      for (int k = (i + 1); k <= (j); ++k)
        if (can[i][k - 1] && can[k][j]) {
          can[i][j] = 1;
        }
    }
  if (!can[1][n]) {
    cout << "IMPOSSIBLE";
    return 0;
  }
  res = "";
  go(1, n);
  cout << res << endl;
  return 0;
}
