#1#2#3AC,其他全WA
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct Node {
int id, z;
ll a, st, nd, ed;
bool operator< (Node x) const {
if (z != x.z) {
return z < x.z;
}else {
return a > x.a;
}
}
};
Node x;
Node doing;
priority_queue<Node> pq;
int main () {
doing.ed = -1LL;
pq = priority_queue<Node>();
while (cin >> x.id >> x.a >> x.nd >> x.z) {
x.st = x.a;
x.ed = x.st + x.nd;
while (doing.ed < x.st) {
if (doing.ed > -1) {
printf("%i %lld\n", doing.id, doing.ed);
}
Node x;
if (!pq.empty()) {
x = pq.top();
pq.pop();
x.st = max(doing.ed, x.st);
x.ed = x.st + x.nd;
doing = x;
}else {
x = {0, 0, 0LL, 0LL, 0LL, -1};
doing = x;
break;
}
// printf("\ta%i %lld\n", doing.id, doing.ed);
}
pq.push(x);
if (pq.top().z > doing.z) {
auto x = pq.top();
pq.pop();
x.ed = x.st + x.nd;
if (doing.ed > -1) {
doing.nd -= x.st - doing.st;
pq.push(doing);
}
// printf("\tb%i %lld %i %lld\n", doing.id, doing.nd, x.id, x.ed);
doing = x;
}
}
while (!pq.empty()) {
if (doing.ed != -1) {
printf("%i %lld\n", doing.id, doing.ed);
}
auto x = pq.top();
pq.pop();
x.ed = max(doing.ed, x.st) + x.nd;
doing = x;
}
printf("%i %lld\n", doing.id, doing.ed);
return 0;
}