#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r;
  bool operator<(const node& b) const { return this->l > b.l; }
};
priority_queue<node> p, q;
int data[210][2];
int main() {
  int n;
  bool flag;
  scanf("%d", &n);
  node temp;
  temp.l = 1;
  temp.r = 1e9 + 1e7;
  q.push(temp);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &data[i][0], &data[i][1]);
    flag = false;
    while (!q.empty()) {
      node t = q.top();
      q.pop();
      if (t.l <= data[i][0] && t.r >= (data[i][0] + data[i][1] - 1)) {
        data[i][1] = data[i][0] + data[i][1] - 1;
        if (t.l < data[i][0]) {
          temp.l = t.l;
          temp.r = data[i][0] - 1;
          q.push(temp);
        }
        if (t.r > data[i][1]) {
          temp.l = data[i][1] + 1;
          temp.r = t.r;
          q.push(temp);
        }
        flag = true;
        break;
      }
      p.push(t);
    }
    if (!flag) {
      while (!p.empty()) {
        node t = p.top();
        p.pop();
        if (t.r - t.l + 1 >= data[i][1]) {
          data[i][0] = t.l;
          data[i][1] = t.l + data[i][1] - 1;
          if (t.r > data[i][1]) {
            temp.l = data[i][1] + 1;
            temp.r = t.r;
            q.push(temp);
          }
          break;
        }
        q.push(t);
      }
    }
    while (!p.empty()) {
      node t = p.top();
      p.pop();
      q.push(t);
    }
  }
  for (int i = 0; i < n; i++) {
    printf("%d %d\n", data[i][0], data[i][1]);
  }
}
