#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N = 1e6 + 10;
ll total_len = 0;
struct scanline {
ll x1, x2, y;
int flag;
bool operator<(const scanline& other) const {return y < other.y;}
};
struct seg {
int ld, rd, cover;
ll len;
};
int n;
ll xs[MAX_N * 2];
scanline lines[MAX_N * 2];
seg tnode[MAX_N * 4];
#define lson(x) ((x) << 1)
#define rson(x) ((x) << 1 | 1)
void build(int id, int ld, int rd) {
tnode[id].ld = ld;
tnode[id].rd = rd;
tnode[id].cover = 0;
tnode[id].len = 0;
if (ld == rd) return;
int mid = (ld + rd) / 2;
build(lson(id), ld, mid);
build(rson(id), mid + 1, rd);
}
void update1(int id) {
if (tnode[id].cover > 0) tnode[id].len = xs[tnode[id].rd + 1] - xs[tnode[id].ld];
else {
if (tnode[id].ld == tnode[id].rd) tnode[id].len = 0;
else tnode[id].len = tnode[lson(id)].len + tnode[rson(id)].len;
}
}
void update2(int id, ll x1, ll x2, int flag) {
if (xs[tnode[id].rd + 1] <= x1 || x2 <= xs[tnode[id].ld]) return;
if (x1 <= xs[tnode[id].ld] && xs[tnode[id].rd + 1] <= x2) {
tnode[id].cover += flag;
update1(id);
return;
}
update2(lson(id), x1, x2, flag);
update2(rson(id), x1, x2, flag);
update1(id);
}
int x1[5010], yy1[5010], x2[5010], y2[5010];
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> x1[i] >> yy1[i] >> x2[i] >> y2[i];
xs[i * 2] = x1[i];
xs[i * 2 + 1] = x2[i];
lines[i * 2] = {x1[i], x2[i], yy1[i], 1};
lines[i * 2 + 1] = {x1[i], x2[i], y2[i], -1};
}
int lines_cnt = n * 2;
sort(xs, xs + lines_cnt);
int xlen = unique(xs, xs + lines_cnt) - xs;
build(1, 0, xlen - 2);
sort(lines, lines + lines_cnt);
int pre = 0;
for (int i = 0; i < lines_cnt; ++i) {
update2(1, lines[i].x1, lines[i].x2, lines[i].flag);
total_len += abs(tnode[1].len - pre);
cout << tnode[1].len - pre << endl;
pre = tnode[1].len;
}
for (int i = 0; i < n; ++i) {
xs[i * 2] = yy1[i];
xs[i * 2 + 1] = y2[i];
lines[i * 2] = {yy1[i], y2[i], x1[i], 1};
lines[i * 2 + 1] = {yy1[i], y2[i], x2[i], -1};
}
lines_cnt = n * 2;
sort(xs, xs + lines_cnt);
xlen = unique(xs, xs + lines_cnt) - xs;
build(1, 0, xlen - 2);
sort(lines, lines + lines_cnt);
pre = 0;
for (int i = 0; i < lines_cnt; ++i) {
update2(1, lines[i].x1, lines[i].x2, lines[i].flag);
total_len += abs(tnode[1].len - pre);
cout << abs(tnode[1].len - pre) << endl;
pre = tnode[1].len;
}
cout << total_len;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgTUFYX04gPSAxZTYgKyAxMDsKbGwgdG90YWxfbGVuID0gMDsKc3RydWN0IHNjYW5saW5lIHsKICAgIGxsIHgxLCB4MiwgeTsKICAgIGludCBmbGFnOwogICAgYm9vbCBvcGVyYXRvcjwoY29uc3Qgc2NhbmxpbmUmIG90aGVyKSBjb25zdCB7cmV0dXJuIHkgPCBvdGhlci55O30KfTsKc3RydWN0IHNlZyB7CiAgICBpbnQgbGQsIHJkLCBjb3ZlcjsgCiAgICBsbCBsZW47Cn07CmludCBuOwpsbCB4c1tNQVhfTiAqIDJdOwpzY2FubGluZSBsaW5lc1tNQVhfTiAqIDJdOwpzZWcgdG5vZGVbTUFYX04gKiA0XTsKI2RlZmluZSBsc29uKHgpICAoKHgpIDw8IDEpCiNkZWZpbmUgcnNvbih4KSAoKHgpIDw8IDEgfCAxKQp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGxkLCBpbnQgcmQpIHsKICAgIHRub2RlW2lkXS5sZCA9IGxkOwogICAgdG5vZGVbaWRdLnJkID0gcmQ7CiAgICB0bm9kZVtpZF0uY292ZXIgPSAwOwogICAgdG5vZGVbaWRdLmxlbiA9IDA7CiAgICBpZiAobGQgPT0gcmQpIHJldHVybjsKICAgIGludCBtaWQgPSAobGQgKyByZCkgLyAyOwogICAgYnVpbGQobHNvbihpZCksIGxkLCBtaWQpOwogICAgYnVpbGQocnNvbihpZCksIG1pZCArIDEsIHJkKTsKfQoKdm9pZCB1cGRhdGUxKGludCBpZCkgewogICAgaWYgKHRub2RlW2lkXS5jb3ZlciA+IDApIHRub2RlW2lkXS5sZW4gPSB4c1t0bm9kZVtpZF0ucmQgKyAxXSAtIHhzW3Rub2RlW2lkXS5sZF07CiAgICBlbHNlIHsKICAgICAgICBpZiAodG5vZGVbaWRdLmxkID09IHRub2RlW2lkXS5yZCkgdG5vZGVbaWRdLmxlbiA9IDA7CiAgICAgICAgZWxzZSB0bm9kZVtpZF0ubGVuID0gdG5vZGVbbHNvbihpZCldLmxlbiArIHRub2RlW3Jzb24oaWQpXS5sZW47CiAgICB9Cn0KCnZvaWQgdXBkYXRlMihpbnQgaWQsIGxsIHgxLCBsbCB4MiwgaW50IGZsYWcpIHsKICAgIGlmICh4c1t0bm9kZVtpZF0ucmQgKyAxXSA8PSB4MSB8fCB4MiA8PSB4c1t0bm9kZVtpZF0ubGRdKSByZXR1cm47CiAgICBpZiAoeDEgPD0geHNbdG5vZGVbaWRdLmxkXSAmJiB4c1t0bm9kZVtpZF0ucmQgKyAxXSA8PSB4MikgewogICAgICAgIHRub2RlW2lkXS5jb3ZlciArPSBmbGFnOwogICAgICAgIHVwZGF0ZTEoaWQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHVwZGF0ZTIobHNvbihpZCksIHgxLCB4MiwgZmxhZyk7CiAgICB1cGRhdGUyKHJzb24oaWQpLCB4MSwgeDIsIGZsYWcpOwogICAgdXBkYXRlMShpZCk7Cn0KCmludCB4MVs1MDEwXSwgeXkxWzUwMTBdLCB4Mls1MDEwXSwgeTJbNTAxMF07CmludCBtYWluKCkgewoJY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgCWNpbiA+PiB4MVtpXSA+PiB5eTFbaV0gPj4geDJbaV0gPj4geTJbaV07CiAgICAgICAgeHNbaSAqIDJdID0geDFbaV07CiAgICAgICAgeHNbaSAqIDIgKyAxXSA9IHgyW2ldOwogICAgICAgIGxpbmVzW2kgKiAyXSA9IHt4MVtpXSwgeDJbaV0sIHl5MVtpXSwgMX07IAogICAgICAgIGxpbmVzW2kgKiAyICsgMV0gPSB7eDFbaV0sIHgyW2ldLCB5MltpXSwgLTF9OwogICAgfQogICAgaW50IGxpbmVzX2NudCA9IG4gKiAyOwogICAgc29ydCh4cywgeHMgKyBsaW5lc19jbnQpOwogICAgaW50IHhsZW4gPSB1bmlxdWUoeHMsIHhzICsgbGluZXNfY250KSAtIHhzOwogICAgYnVpbGQoMSwgMCwgeGxlbiAtIDIpOwogICAgc29ydChsaW5lcywgbGluZXMgKyBsaW5lc19jbnQpOwogICAgaW50IHByZSA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzX2NudDsgKytpKSB7CiAgICAgICAgdXBkYXRlMigxLCBsaW5lc1tpXS54MSwgbGluZXNbaV0ueDIsIGxpbmVzW2ldLmZsYWcpOwogICAgICAgIHRvdGFsX2xlbiArPSBhYnModG5vZGVbMV0ubGVuIC0gcHJlKTsKICAgICAgICAKICAgICAgICBjb3V0IDw8IHRub2RlWzFdLmxlbiAtIHByZSA8PCBlbmRsOwogICAgICAgIHByZSA9IHRub2RlWzFdLmxlbjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgeHNbaSAqIDJdID0geXkxW2ldOwogICAgICAgIHhzW2kgKiAyICsgMV0gPSB5MltpXTsKICAgICAgICBsaW5lc1tpICogMl0gPSB7eXkxW2ldLCB5MltpXSwgeDFbaV0sIDF9OyAKICAgICAgICBsaW5lc1tpICogMiArIDFdID0ge3l5MVtpXSwgeTJbaV0sIHgyW2ldLCAtMX07CiAgICB9CiAgICBsaW5lc19jbnQgPSBuICogMjsKICAgIHNvcnQoeHMsIHhzICsgbGluZXNfY250KTsKICAgIHhsZW4gPSB1bmlxdWUoeHMsIHhzICsgbGluZXNfY250KSAtIHhzOwogICAgYnVpbGQoMSwgMCwgeGxlbiAtIDIpOwogICAgc29ydChsaW5lcywgbGluZXMgKyBsaW5lc19jbnQpOwogICAgcHJlID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXNfY250OyArK2kpIHsKICAgICAgICB1cGRhdGUyKDEsIGxpbmVzW2ldLngxLCBsaW5lc1tpXS54MiwgbGluZXNbaV0uZmxhZyk7CiAgICAgICAgdG90YWxfbGVuICs9IGFicyh0bm9kZVsxXS5sZW4gLSBwcmUpOwogICAgICAgIAogICAgICAgIGNvdXQgPDwgYWJzKHRub2RlWzFdLmxlbiAtIHByZSkgPDwgZW5kbDsKICAgICAgICBwcmUgPSB0bm9kZVsxXS5sZW47CiAgICB9CiAgICBjb3V0IDw8IHRvdGFsX2xlbjsKICAgIHJldHVybiAwOwp9