/*
 *******************************************************************************
 * プログラム概要
 *
 * Ａ大学は１フロア１０部屋、３階建ての公舎４棟を管理しています。
 * 公舎の入居・退去の情報を読み込み、各部屋の入居者数を出力するプログラム
 *
 * Input		: 最初の行に情報の数 n が与えられます。
 *				  続いて n 件の情報が与えられます。
 *				  各情報には４つの整数 b, f, r, v が空白区切りで１行に与えられます。
 *				  これは、b棟f階のr番目の部屋にv人が追加で入居したことを示します。
 *				  vが負の値の場合、v人退去したことを示します。
 *				  最初、全ての部屋には誰も入居していないものとします。
 * Output		: ４棟について入居者数を出力して下さい。
 *				  各棟について、１階、２階、３階の順に入居者数を出力します。
 *				  各階については、１番目、２番目、・・・、１０番目の部屋の入居者数を順番に出力します。
 *				  入居者数の前には１つの空白を出力して下さい。
 *				  また、各棟の間には####################(20個の#)で区切って下さい。
 *
 * http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_6_C&lang=jp
 *******************************************************************************
 */

#include<cstdio>
#include<stdlib.h>

#define B_MAX 4
#define B_MIN 1
#define F_MAX 3
#define F_MIN 1
#define R_MAX 10
#define R_MIN 1
#define V_MAX 9
#define V_MIN 0


class HOUSE
{
	public:
		// Public member function
		int Input(void);
		int Check(void);
		void Print(void);
	private:
		// Private member variable
		int n = 0, b = 0, f = 0, r = 0, v = 0;		// n:情報の数 b:棟番号 f:階 r:部屋番号 v:入居する人数
		int house[B_MAX][F_MAX][R_MAX]={ { { 0 } } };	// b棟f階のr番目の部屋の入居者数
};


/*
 *************************************************************************
 * 関数概要		: 棟番号・階・部屋番号・入居者数を取得する
 * param[in]	: なし
 * return		: 0 正常終了
 *				  -1 異常終了
 * note			:異常系処理：
 *					以下の場合、プログラムは途中でエラー終了する。
 *					・Check関数の結果がエラーであるとき
 *					・1部屋の入居者数の制限を満たしていないとき
 *************************************************************************
 */
int HOUSE::Input(void)
{
	scanf("%d %d %d %d\n", &b, &f, &r, &v);
	
	if(Check() == -1)
	{
		return -1;
	}
	
	house[b-1][f-1][r-1] += v;
	
	if( (house[b-1][f-1][r-1] < V_MIN) || (house[b-1][f-1][r-1] > V_MAX) )
	{
		// 1部屋の入居者数の制限を満たしていないため、ERROR終了
		return -1;
	}
	
	return 0;
}


/*
 *************************************************************************
 * 関数概要		: 棟番号・階・部屋番号が条件を満たしているかCheckする
 * param[in]	: なし
 * return		: 0 正常終了
 *				  -1 異常終了
 * note			:異常系処理：
 *					以下の場合、プログラムは途中でエラー終了する。
 *					・整数値が制約の範囲外だった場合
 *************************************************************************
 */
int HOUSE::Check(void)
{
	if( (b < B_MIN) || (b > B_MAX) ||
		(f < F_MIN) || (f > F_MAX) ||
		(r < R_MIN) || (r > R_MAX) )
	{
		// 間違った棟番号・階・部屋番号のため、ERROR終了
		return -1;
	}
	
	return 0;
}


/*
 *************************************************************************
 * 関数概要		: 入居者数を棟ごとに表示する
 * param[in]	: なし
 * return		: なし
 *************************************************************************
 */
void HOUSE::Print(void)
{
	for(int i = 0; i < B_MAX; i++)
	{
		for(int j = 0; j < F_MAX; j++)
		{
			for(int k = 0; k < R_MAX; k++)
			{
				printf(" %d", house[i][j][k]);
			}
			printf("\n");
		}
		if(i != B_MAX - 1)
		{
			// 各棟の間には####################(20個の#)で区切る
			printf("####################\n");
		}
	}
}


/*
 *************************************************************************
 * 関数概要		: main処理
 * param[in]	: なし
 * return		: 0 正常終了
 *				  -1 異常終了
 * note			:異常系処理：
 *					以下の場合、プログラムは途中でエラー終了する。
 *					・正常に整数値を取得することができなかった場合
 *					・取得した整数値が制約の範囲外だった場合
 *************************************************************************
 */
int main(void)
{
	int n = 0;
	HOUSE House;
	
	scanf("%d", &n);
	while( n-- > 0 )
	{
		if(House.Input() == -1)
		{
			return -1;
		}
	}
	
	House.Print();
	
	return 0;
}




Measured memory_bytes: 2680