//======================================================================
// Contents    : AOJ ITP1_6_C
//               公舎の入居・退去の情報を読み込み、各部屋の入居者数を出力
//               １フロア１０部屋、３階建ての公舎が４棟存在
// Input       : 情報の数 n
//               棟　　　　　　　　building (1 ≦ b ≦ 4)
//               階数　　　　　　　floor    (1 ≦ f ≦ 3)
//               部屋番号　　　　　room     (1 ≦ r ≦ 10)
//               追加（退去）人数　move     ( - 元の人数 ≦ v ≦ 9 - 元の人数)
// Output      : 入居者数 (例参照)
// Constraints : 最初、全ての部屋には誰も入居していない
//               各棟の間には####################(20個の#)で区切られる
//               0 ≦ １部屋の入居者数 ≦ 9
// Example     : 入力）
//               3
//               1 1 3 8
//               3 2 2 7
//               4 3 8 1
//               出力)
//                0 0 8 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//               ####################
//                0 0 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//               ####################
//                0 0 0 0 0 0 0 0 0 0
//                0 7 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//               ####################
//                0 0 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 0 0 0
//                0 0 0 0 0 0 0 1 0 0
// Author      : 廣部智也
// LastUpdate  : 2020/06/23
// Since       : 2020/06/23
//======================================================================

#include <stdio.h>
#include <stdlib.h>                                                       // exit 関数を使用するため

#define LOWER_LIMIT_b  1
#define UPPER_LIMIT_b  4
#define LOWER_LIMIT_f  1
#define UPPER_LIMIT_f  3
#define LOWER_LIMIT_r  1
#define UPPER_LIMIT_r 10
#define LOWER_LIMIT_m  0
#define UPPER_LIMIT_m  9

#define FLOOR  3
#define ROOM  10

#define between_buildings printf("####################\n");

// 入力エラーを判断する関数
int Input_error( int number, int lower_limit, int upper_limit );

// 住居者の住居、退去情報を更新する関数
void resident_update( int floor, int room, int move, int resident_number[FLOOR][ROOM] );

// 住居者情報を表示する関数
void resident_display( int resident_number[FLOOR][ROOM] );



int main(){

    int resident_1[FLOOR][ROOM] = {}, resident_2[FLOOR][ROOM] = {},
        resident_3[FLOOR][ROOM] = {}, resident_4[FLOOR][ROOM] = {};

    int n = 0, building = 0, floor = 0, room = 0, move = 0;

    // データの入力：カードの所持数
    scanf("%d", &n );
    
    while( n-- > 0){

        scanf("%d %d %d %d", &building, &floor, &room, &move);

        Input_error( building , LOWER_LIMIT_b, UPPER_LIMIT_b );
        Input_error( floor    , LOWER_LIMIT_f, UPPER_LIMIT_f );
        Input_error( room     , LOWER_LIMIT_r, UPPER_LIMIT_r );

        // データの処理：居住者の情報を反映
        switch( building ) {

            case 1:
                resident_update( floor, room, move, resident_1 );
                break;
            case 2:
                resident_update( floor, room, move, resident_2 );
                break;
            case 3:
                resident_update( floor, room, move, resident_3 );
                break;
            case 4:
                resident_update( floor, room, move, resident_4 );
                break;
            default:
                printf("error\n");
                break;
                
        }
    }
    
    // データの出力：不足カードを表示
    resident_display( resident_1 );
    between_buildings;
    resident_display( resident_2 );
    between_buildings;
    resident_display( resident_3 );
    between_buildings;
    resident_display( resident_4 );

    return 0;
}



//==========================================================================================
// Contents    : ある一部屋の居住者の情報を更新
// Author      : 廣部智也
// LastUpdate  : 2020/06/23
// Since       : 2020/06/17
//==========================================================================================

void resident_update( int floor, int room, int move, int resident_number[FLOOR][ROOM] ){
    
    int resident = 0;
    
    resident = resident_number[floor-1][room-1];
    Input_error( resident + move , LOWER_LIMIT_m, UPPER_LIMIT_m );
    resident_number[floor-1][room-1] = resident + move;
    
    return;
}



//=========================================================================
// Contents    : ○棟の居住者の情報を表示
// Author      : 廣部智也
// LastUpdate  : 2020/06/23
// Since       : 2020/06/23
//=========================================================================

void resident_display( int resident_number[FLOOR][ROOM] ){

    int i = 0;
    int j = 0;

    for ( i = 0; i < FLOOR; ++i ) {
        for ( j = 0; j < ROOM; ++j ) {
            printf(" %d", resident_number[i][j] );
        }
        printf("\n");
    }
    
    return;
}



//============================================================
// Contents    : 入力エラーを判断
// Input       : 調べる変数, 下限, 上限
// Output      : エラーなら強制終了
// Author      : 廣部智也
// LastUpdate  : 2020/06/05
// Since       : 2020/06/05
//============================================================

int Input_error( int number, int lower_limit, int upper_limit ){
    
    if( number < lower_limit || number > upper_limit ){
        printf("Input error\n");
        exit(1);
    }

    return 0;
}



Measured memory_bytes: 2044