#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<int,int> PII;

const int MAXN = 10005;
const int K = 1;

int tot, X[MAXN<<1], CX;
pair<PII, PII> E[MAXN<<1];

struct Rect {
	int x1, y1, x2, y2;
	Rect(int x1,int y1,int x2,int y2)
		: x1(x1), y1(y1), x2(x2), y2(y2) {}
};

struct SegTree {
	int L, R, Lson, Rson, cover, length[K+1];
	void build(int, int);
	void add(int, int, int);
} T, A[MAXN<<2];

void SegTree::build(int l, int r) {
	L = l;
	R = r;
	cover = 0;
	memset(length, 0, sizeof(length));
	length[0] = X[R+1] - X[L];
	if (L == R) return ;
	int mid = (L+R)>>1;
	A[Lson = tot++].build(l, mid);
	A[Rson = tot++].build(mid+1, r);
}

void SegTree::add(int v, int l, int r) {
	memset(length, 0, sizeof(length));
	if (l <= L && R <= r) {
		cover += v;
		if (L == R) {
			length[min(cover, K)] += X[R+1] - X[L];
		} else {
			for (int i = 0; i <= K; ++i) {
				length[min(i+cover, K)] += A[Lson].length[i] + A[Rson].length[i];
			}
		}
		return ;
	}
	int mid = (L + R) >> 1;
	if (l <= mid) A[Lson].add(v, l, r);
	if (r > mid) A[Rson].add(v, l, r);
	for (int i = 0; i <= K; ++i) {
		length[min(i+cover,K)] += A[Lson].length[i] + A[Rson].length[i];
	}
}

void discrete(vector<Rect>& R) {
	int N = R.size();
	int i, tx1, tx2;
	for (CX = i = 0; i < N; ++i) {
		X[CX++] = R[i].x1;
		X[CX++] = R[i].x2;
	}
	sort(X, X+CX);
	CX = unique(X, X+CX) - X;
	T.build(tot = 0, CX-2);
	for (i = 0; i < N; ++i) {
		tx1 = lower_bound(X, X+CX, R[i].x1) - X;
		tx2 = lower_bound(X, X+CX, R[i].x2) - X;
		E[i].second = E[i+N].second = PII(tx1, tx2);
		E[i].first = PII(R[i].y1, -1);
		E[i+N].first = PII(R[i].y2, 1);
	}
	sort(E, E + (N << 1));
}

LL area(vector<Rect>& R) {
	int N = R.size();
	if (!N) return 0;
	int i, k, prv;
	LL ret = 0;
	discrete(R);
	prv = E[0].first.first;
	for (i = 0; i < (N<<1); ++i) {
		ret += (LL)T.length[K] * (E[i].first.first - prv);
		prv = E[i].first.first;
		T.add(-E[i].first.second, E[i].second.first, E[i].second.second-1);
	}
	return ret;
}

int n;
vector<Rect> R[8];
LL unionR[8], interR[8];

int main() {
	int T;
	scanf("%d", &T);
	for (int cas = 1; cas <= T; ++cas) {
		scanf("%d", &n);
		for (int i = 1; i < 8; ++i)
			R[i].clear();
		for (int id,x1,y1,x2,y2,i = 0; i < n; ++i) {
			char ch[2];
			scanf("%s%d%d%d%d", ch, &x1, &y1, &x2, &y2);
			Rect tmp(x1,y1,x2,y2);
			if (ch[0] == 'R') {
				id = 1;
			} else if (ch[0] == 'G') {
				id = 2;
			} else if (ch[0] == 'B') {
				id = 4;
			}
			for (int i = 1; i < 8; ++i) {
				if (i & id) R[i].push_back(tmp);
			}
		}
		for (int i = 1; i < 8; ++i) {
			unionR[i] = area(R[i]);
		}
		interR[1] = unionR[1];
		interR[2] = unionR[2];
		interR[4] = unionR[4];
		interR[3] = interR[2] + interR[1] - unionR[3];
		interR[5] = interR[4] + interR[1] - unionR[5];
		interR[6] = interR[4] + interR[2] - unionR[6];
		interR[7] = unionR[7]
					- interR[4] - interR[2] - interR[1]
					+ interR[3] + interR[5] + interR[6];
		interR[3] -= interR[7];
		interR[5] -= interR[7];
		interR[6] -= interR[7];
		interR[1] -= interR[3] + interR[5] + interR[7];
		interR[2] -= interR[3] + interR[6] + interR[7];
		interR[4] -= interR[5] + interR[6] + interR[7];
		printf("Case %d:\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d\n",
			cas,
			interR[1], interR[2], interR[4],
			interR[3], interR[5], interR[6],
			interR[7]);
	}
}