#include <bits/stdc++.h>
using namespace std;
char DP[605][605][2];
int l[605], r[605];
struct S {
  int st, end;
  char flag;
};
S make_S(int st, int end, char flag) {
  S ret;
  ret.st = st;
  ret.end = end;
  ret.flag = flag;
  return ret;
}
S TL[605][605][2];
S TR[605][605][2];
char F(int st, int end, char flag) {
  int i;
  if (st == end) {
    return (l[st] == 1);
  }
  if (DP[st][end][flag] != -1) return DP[st][end][flag];
  char& ret = DP[st][end][flag];
  ret = 0;
  if (flag) {
    int d = (end - st) * 2 + 1;
    if (d < l[st] || d > r[st]) return ret = 0;
    ret = F(st + 1, end, 1);
    if (ret) {
      TL[st][end][flag] = make_S(st + 1, end, 1);
      return ret;
    }
    for (i = st + 1; i < end; i++) {
      char f1, f2, f3, f4;
      f1 = F(st + 1, i, 0);
      f2 = F(st + 1, i, 1);
      f3 = F(i + 1, end, 0);
      f4 = F(i + 1, end, 1);
      if (f1 && f3) {
        TL[st][end][flag] = make_S(st + 1, i, 0);
        TR[st][end][flag] = make_S(i + 1, end, 0);
        return ret = 1;
      } else if (f1 && f4) {
        TL[st][end][flag] = make_S(st + 1, i, 0);
        TR[st][end][flag] = make_S(i + 1, end, 1);
        return ret = 1;
      } else if (f2 && f3) {
        TL[st][end][flag] = make_S(st + 1, i, 1);
        TR[st][end][flag] = make_S(i + 1, end, 0);
        return ret = 1;
      } else if (f2 && f4) {
        TL[st][end][flag] = make_S(st + 1, i, 1);
        TR[st][end][flag] = make_S(i + 1, end, 1);
        return ret = 1;
      }
    }
    return ret = 0;
  } else {
    for (i = st; i < end; i++) {
      char f1, f2, f3, f4;
      f1 = F(st, i, 0);
      f2 = F(st, i, 1);
      f3 = F(i + 1, end, 0);
      f4 = F(i + 1, end, 1);
      if (f1 && f3) {
        TL[st][end][flag] = make_S(st, i, 0);
        TR[st][end][flag] = make_S(i + 1, end, 0);
        return ret = 1;
      } else if (f1 && f4) {
        TL[st][end][flag] = make_S(st, i, 0);
        TR[st][end][flag] = make_S(i + 1, end, 1);
        return ret = 1;
      } else if (f2 && f3) {
        TL[st][end][flag] = make_S(st, i, 1);
        TR[st][end][flag] = make_S(i + 1, end, 0);
        return ret = 1;
      } else if (f2 && f4) {
        TL[st][end][flag] = make_S(st, i, 1);
        TR[st][end][flag] = make_S(i + 1, end, 1);
        return ret = 1;
      }
    }
    return ret = 0;
  }
}
void trace(int st, int end, char flag) {
  if (st == end) {
    printf("()");
    return;
  }
  if (flag) printf("(");
  if (TL[st][end][flag].flag != -1) {
    int st1, end1;
    char flag1;
    st1 = TL[st][end][flag].st;
    end1 = TL[st][end][flag].end;
    flag1 = TL[st][end][flag].flag;
    trace(st1, end1, flag1);
  }
  if (TR[st][end][flag].flag != -1) {
    int st1, end1;
    char flag1;
    st1 = TR[st][end][flag].st;
    end1 = TR[st][end][flag].end;
    flag1 = TR[st][end][flag].flag;
    trace(st1, end1, flag1);
  }
  if (flag) printf(")");
}
int main() {
  memset(DP, -1, sizeof(DP));
  memset(TL, -1, sizeof(TL));
  memset(TR, -1, sizeof(TR));
  int i, N;
  scanf("%d", &N);
  for (i = 1; i <= N; i++) scanf("%d%d", &l[i], &r[i]);
  char x = F(1, N, 0);
  char y = F(1, N, 1);
  if (x)
    trace(1, N, 0);
  else if (y)
    trace(1, N, 1);
  else
    printf("IMPOSSIBLE");
  puts("");
  return 0;
}
