#include <bits/stdc++.h>
using namespace std;
struct flowGraph {
  int n, m, s, t, E;
  vector<int> to, cap, NEXT;
  vector<int> last, now, dist;
  flowGraph() {}
  flowGraph(int n, int m, int s, int t) : n(n), m(m), s(s), t(t) {
    to = cap = NEXT = vector<int>(2 * m + 5);
    last = now = dist = vector<int>(n + 5);
    E = 0;
    last = vector<int>(n + 5, -1);
  }
  void add(int u, int v, int uv, int vu = 0) {
    to[E] = v;
    cap[E] = uv;
    NEXT[E] = last[u];
    last[u] = E++;
    to[E] = u;
    cap[E] = vu;
    NEXT[E] = last[v];
    last[v] = E++;
  }
  bool bfs() {
    for (int i = 0; i < n; ++i) dist[i] = (1 << 30);
    queue<int> Q;
    dist[t] = 0;
    Q.push(t);
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      for (int e = last[u]; e != -1; e = NEXT[e]) {
        int v = to[e];
        if (cap[e ^ 1] && dist[v] >= (1 << 30)) {
          dist[v] = dist[u] + 1;
          Q.push(v);
        }
      }
    }
    return dist[s] < (1 << 30);
  }
  int dfs(int u, int f) {
    if (u == t) return f;
    for (int &e = now[u]; e != -1; e = NEXT[e]) {
      int v = to[e];
      if (cap[e] && dist[u] == dist[v] + 1) {
        int ret = dfs(v, min(f, cap[e]));
        if (ret) {
          cap[e] -= ret;
          cap[e ^ 1] += ret;
          return ret;
        }
      }
    }
    return 0;
  }
  long long maxFlow() {
    long long flow = 0;
    while (bfs()) {
      for (int i = 0; i < n; ++i) now[i] = last[i];
      while (1) {
        int f = dfs(s, (1 << 30));
        if (!f) break;
        flow += f;
      }
    }
    return flow;
  }
};
void buildCirculationGraph(int n, vector<int> &from, vector<int> &to,
                           vector<int> &lo, vector<int> &hi, int points) {
  int s = n, t = n + 1;
  flowGraph G(n + 2, 1000000, s, t);
  vector<int> d(n + 2);
  for (int i = 0; i < ((int)(from).size()); ++i) {
    G.add(from[i], to[i], hi[i] - lo[i]);
    d[from[i]] += lo[i];
    d[to[i]] -= lo[i];
  }
  for (int i = 0; i < n; ++i)
    if (d[i] < 0)
      G.add(s, i, -d[i]);
    else if (d[i] > 0)
      G.add(i, t, d[i]);
  int f = G.maxFlow();
  for (int i = 0; i < points; ++i) {
    if (hi[i] - G.cap[2 * i] == 1) {
      putchar('r');
    } else
      putchar('b');
  }
  puts("");
}
vector<int> UNIQUE(vector<int> x) {
  sort(x.begin(), x.end());
  x.resize(unique(x.begin(), x.end()) - x.begin());
  return x;
}
int getId(vector<int> &v, int x) {
  return lower_bound(v.begin(), v.end(), x) - v.begin();
}
int main() {
  int n;
  while (scanf("%d", &n) == 1) {
    vector<int> X, Y;
    for (int i = 0; i < n; ++i) {
      int x, y;
      scanf("%d", &x), scanf("%d", &y);
      X.push_back(x), Y.push_back(y);
    }
    vector<int> A = UNIQUE(X), B = UNIQUE(Y);
    int nodes = ((int)(A).size()) + ((int)(B).size()) + 2, s = nodes - 1,
        t = s - 1;
    vector<int> deg(nodes);
    vector<int> from, to, lo, hi;
    for (int i = 0; i < n; ++i) {
      int u = getId(A, X[i]), v = ((int)(A).size()) + getId(B, Y[i]);
      from.push_back(u), to.push_back(v), lo.push_back(0), hi.push_back(1);
      deg[u]++, deg[v]++;
    }
    for (int i = 0; i < ((int)(A).size()); ++i) {
      int u = i;
      from.push_back(s), to.push_back(u), lo.push_back(deg[u] / 2),
          hi.push_back((deg[u] - 1) / 2 + 1);
    }
    for (int i = 0; i < ((int)(B).size()); ++i) {
      int v = ((int)(A).size()) + i;
      from.push_back(v), to.push_back(t), lo.push_back(deg[v] / 2),
          hi.push_back((deg[v] - 1) / 2 + 1);
    }
    from.push_back(t), to.push_back(s), lo.push_back(0), hi.push_back(1000000);
    buildCirculationGraph(nodes, from, to, lo, hi, n);
  }
}
