#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) > (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define x first
#define y second
#define pb push_back
#define PB pop_back()
#define iOS ios_base::sync_with_stdio(false)
#define sqr(a) (((a) * (a)))
#define all(a) a.begin() , a.end()
#define error(x) cerr << #x << " = " << (x) <<endl
#define Error(a,b) cerr<<"( "<<#a<<" , "<<#b<<" ) = ( "<<(a)<<" , "<<(b)<<" )\n";
#define errop(a) cerr<<#a<<" = ( "<<((a).x)<<" , "<<((a).y)<<" )\n";
#define coud(a,b) cout<<fixed << setprecision((b)) << (a)
#define L(x) ((x)<<1)
#define R(x) (((x)<<1)+1)
#define umap unordered_map
#define double long double
typedef long long ll;
typedef pair<int,int>pii;
typedef vector<int> vi;
typedef complex<double> point;
template <typename T> using os = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <class T> inline void smax(T &x,T y){ x = max((x), (y));}
template <class T> inline void smin(T &x,T y){ x = min((x), (y));}
const int maxn = 2e5 + 10;
vi adj[maxn * 2];
int x[maxn * 2];
map <pii, int> mp;
map <pii, bool> del;
vector<int> eu;
set<int> d[2];
int deg[maxn * 2];
vector<pii> edges;
inline void euler(int v){
while(!adj[v].empty()){
int u = adj[v].back();
adj[v].PB;
if(!del[{v, u}]){
del[{v, u}] = del[{u, v}] = true;
euler(u);
}
}
eu.pb(v);
}
inline void deledge(int v,int u){
del[{v, u}] = true;
del[{u, v}] = true;
d[deg[v]].erase(v);
deg[v] = !deg[v];
d[deg[v]].insert(v);
d[deg[u]].erase(u);
deg[u] = !deg[u];
d[deg[u]].insert(u);
}
inline void solve(){
if(d[1].empty()){
For(i,0,maxn * 2){
eu.clear();
euler(i);
For(j,1,eu.size())
mp[{eu[j], eu[j-1]}] = mp[{eu[j-1], eu[j]}] = j % 2;
}
}
else{
int v = *d[1].begin();
while(!adj[v].empty() && del[{v, adj[v].back()}])
adj[v].PB;
int u = adj[v].back();
deledge(v, u);
solve();
int c = 0;
if(x[u] > 0)
c = 1;
if(c == 1)
x[u] --, x[v] --;
else
x[u] ++, x[v] ++;
mp[{v, u}] = mp[{u, v}] = c;
}
}
int n;
string s = "rb";
int main(){
scanf("%d", &n);
For(i,0,n){
int x, y;
scanf("%d %d", &x, &y);
-- x, -- y;
x = 2 * x + 1;
y = 2 * y;
edges.pb({x, y});
adj[x].pb(y);
adj[y].pb(x);
}
For(i,0,2*maxn)
d[(int)adj[i].size() % 2].insert(i), deg[i] = adj[i].size() % 2;
solve();
rep(e, edges)
printf("%c", (char)s[mp[{e.x, e.y}]]);
puts("");
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIEZvcmVhY2goaSwgYykgZm9yKF9fdHlwZW9mKChjKS5iZWdpbigpKSBpID0gKGMpLmJlZ2luKCk7IGkgIT0gKGMpLmVuZCgpOyArK2kpCiNkZWZpbmUgRm9yKGksYSxiKSBmb3IoaW50IChpKT0oYSk7KGkpIDwgKGIpOyArKyhpKSkKI2RlZmluZSByb2YoaSxhLGIpIGZvcihpbnQgKGkpPShhKTsoaSkgPiAoYik7IC0tKGkpKQojZGVmaW5lIHJlcChpLCBjKSBmb3IoYXV0byAmKGkpIDogKGMpKQojZGVmaW5lIHggZmlyc3QKI2RlZmluZSB5IHNlY29uZAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIFBCIHBvcF9iYWNrKCkKI2RlZmluZSBpT1MgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSkKI2RlZmluZSBzcXIoYSkgKCgoYSkgKiAoYSkpKQojZGVmaW5lIGFsbChhKSBhLmJlZ2luKCkgLCBhLmVuZCgpCiNkZWZpbmUgZXJyb3IoeCkgY2VyciA8PCAjeCA8PCAiID0gIiA8PCAoeCkgPDxlbmRsCiNkZWZpbmUgRXJyb3IoYSxiKSBjZXJyPDwiKCAiPDwjYTw8IiAsICI8PCNiPDwiICkgPSAoICI8PChhKTw8IiAsICI8PChiKTw8IiApXG4iOwojZGVmaW5lIGVycm9wKGEpIGNlcnI8PCNhPDwiID0gKCAiPDwoKGEpLngpPDwiICwgIjw8KChhKS55KTw8IiApXG4iOwojZGVmaW5lIGNvdWQoYSxiKSBjb3V0PDxmaXhlZCA8PCBzZXRwcmVjaXNpb24oKGIpKSA8PCAoYSkKI2RlZmluZSBMKHgpICgoeCk8PDEpCiNkZWZpbmUgUih4KSAoKCh4KTw8MSkrMSkKI2RlZmluZSB1bWFwIHVub3JkZXJlZF9tYXAKI2RlZmluZSBkb3VibGUgbG9uZyBkb3VibGUKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsaW50PnBpaTsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiBjb21wbGV4PGRvdWJsZT4gcG9pbnQ7CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB1c2luZyBvcyA9ICB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CnRlbXBsYXRlIDxjbGFzcyBUPiAgaW5saW5lIHZvaWQgc21heChUICZ4LFQgeSl7IHggPSBtYXgoKHgpLCAoeSkpO30KdGVtcGxhdGUgPGNsYXNzIFQ+ICBpbmxpbmUgdm9pZCBzbWluKFQgJngsVCB5KXsgeCA9IG1pbigoeCksICh5KSk7fQpjb25zdCBpbnQgbWF4biA9IDJlNSArIDEwOwp2aSBhZGpbbWF4biAqIDJdOwppbnQgeFttYXhuICogMl07Cm1hcCA8cGlpLCBpbnQ+IG1wOwptYXAgPHBpaSwgYm9vbD4gZGVsOwp2ZWN0b3I8aW50PiBldTsKc2V0PGludD4gZFsyXTsKaW50IGRlZ1ttYXhuICogMl07CnZlY3RvcjxwaWk+IGVkZ2VzOwppbmxpbmUgdm9pZCBldWxlcihpbnQgdil7Cgl3aGlsZSghYWRqW3ZdLmVtcHR5KCkpewoJCWludCB1ID0gYWRqW3ZdLmJhY2soKTsKCQlhZGpbdl0uUEI7CgkJaWYoIWRlbFt7diwgdX1dKXsKCQkJZGVsW3t2LCB1fV0gPSBkZWxbe3UsIHZ9XSA9IHRydWU7CgkJCWV1bGVyKHUpOwoJCX0KCX0KCWV1LnBiKHYpOwp9CmlubGluZSB2b2lkIGRlbGVkZ2UoaW50IHYsaW50IHUpewoJZGVsW3t2LCB1fV0gPSB0cnVlOwoJZGVsW3t1LCB2fV0gPSB0cnVlOwoJZFtkZWdbdl1dLmVyYXNlKHYpOwoJZGVnW3ZdID0gIWRlZ1t2XTsKCWRbZGVnW3ZdXS5pbnNlcnQodik7CglkW2RlZ1t1XV0uZXJhc2UodSk7CglkZWdbdV0gPSAhZGVnW3VdOwoJZFtkZWdbdV1dLmluc2VydCh1KTsKfQppbmxpbmUgdm9pZCBzb2x2ZSgpewoJaWYoZFsxXS5lbXB0eSgpKXsKCQlGb3IoaSwwLG1heG4gKiAyKXsKCQkJZXUuY2xlYXIoKTsKCQkJZXVsZXIoaSk7CgkJCUZvcihqLDEsZXUuc2l6ZSgpKQoJCQkJbXBbe2V1W2pdLCBldVtqLTFdfV0gPSBtcFt7ZXVbai0xXSwgZXVbal19XSA9IGogJSAyOwoJCX0KCX0KCWVsc2V7CgkJaW50IHYgPSAqZFsxXS5iZWdpbigpOwoJCXdoaWxlKCFhZGpbdl0uZW1wdHkoKSAmJiBkZWxbe3YsIGFkalt2XS5iYWNrKCl9XSkKCQkJYWRqW3ZdLlBCOwoJCWludCB1ID0gYWRqW3ZdLmJhY2soKTsKCQlkZWxlZGdlKHYsIHUpOwoJCXNvbHZlKCk7CgkJaW50IGMgPSAwOwoJCWlmKHhbdV0gPiAwKQoJCQljID0gMTsKCQlpZihjID09IDEpCgkJCXhbdV0gLS0sIHhbdl0gLS07CgkJZWxzZQoJCQl4W3VdICsrLCB4W3ZdICsrOwoJCW1wW3t2LCB1fV0gPSBtcFt7dSwgdn1dID0gYzsKCX0KfQppbnQgbjsKc3RyaW5nIHMgPSAicmIiOwppbnQgbWFpbigpewoJc2NhbmYoIiVkIiwgJm4pOwoJRm9yKGksMCxuKXsKCQlpbnQgeCwgeTsKCQlzY2FuZigiJWQgJWQiLCAmeCwgJnkpOwoJCS0tIHgsIC0tIHk7CgkJeCA9IDIgKiB4ICsgMTsKCQl5ID0gMiAqIHk7CgkJZWRnZXMucGIoe3gsIHl9KTsKCQlhZGpbeF0ucGIoeSk7CgkJYWRqW3ldLnBiKHgpOwoJfQoJRm9yKGksMCwyKm1heG4pCgkJZFsoaW50KWFkaltpXS5zaXplKCkgJSAyXS5pbnNlcnQoaSksIGRlZ1tpXSA9IGFkaltpXS5zaXplKCkgJSAyOwoJc29sdmUoKTsKCXJlcChlLCBlZGdlcykKCQlwcmludGYoIiVjIiwgKGNoYXIpc1ttcFt7ZS54LCBlLnl9XV0pOwoJcHV0cygiIik7Cn0KCg==