Problem:
レシート

問題

太郎君は10冊の本を購入した．
後日，
レシートをもとに価格を調べようとしたが，
レシートには汚れがあり，
ある本の価格が読み取れなかった．
その本の価格を，
10冊の総額と他の9冊の価格から計算することにした．

価格が読み取れなかった本の価格を出力するプログラムを書け．
なお，本の価格はすべて正の整数である．
また，消費税を考慮する必要はない．

入力

入力は複数のデータセットからなる．各データセットは以下の形式で与えられる．

各データセットは10行からなり，1行に1つずつ正の整数が書かれている．
1行目の整数は10冊の総額を，
2行目から10行目の整数は読み取れた価格を表している．
なお，10冊の総額は10000以下である．

総額 が 0 のとき入力の終了を示す.データセットの数は 5 を超えない．

出力

データセットごとに，価格が読み取れなかった本の価格を1 行に出力する．

入出力例

入力例

9850
1050
800
420
380
600
820
2400
1800
980
0

出力例

600

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C (judge verdict: Memory Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define mem(x,y)		(x*)malloc(sizeof(x)*(y))
#define PI 3.14159265358979


int main()
{
	int m,n;
	int k;
	int i,j,l;
	scanf("%d %d",&m,&n);
	scanf("%d",&k);
	char** list = mem(char*,m);
	int*** data = mem(int**,m);
	for(i = 0;i < m;i++)
	{
		list[i] = mem(char,n+1);
		data[i] = mem(int*,n);
		scanf("%s",list[i]);
		int count[2] = {0,0};
		for(j = 0;j < n;j++)
		{
			switch(list[i][j])
			{
				case 'J':
					count[0]++;
					break;
				case 'O':
					count[1]++;
					break;
			}
			data[i][j] = mem(int,2);
			if(i != 0)
			{
				data[i][j][0] = count[0] + data[i-1][j][0];
				data[i][j][1] = count[1] + data[i-1][j][1];
			}
			else
			{
				data[i][j][0] = count[0];
				data[i][j][1] = count[1];
			}
		}
	}
	for(i = 0;i < k;i++)
	{
		int a,b,c,d;
		scanf("%d %d %d %d",&a,&b,&c,&d);
		int jnum,onum;
		if(a != 1)
		{
			if(b != 1)
			{
				jnum = data[c-1][d-1][0]-data[a-2][d-1][0]-data[c-1][b-2][0]+data[a-2][b-2][0];
				onum = data[c-1][d-1][1]-data[a-2][d-1][1]-data[c-1][b-2][1]+data[a-2][b-2][1];
			}
			else
			{
				jnum = data[c-1][d-1][0]-data[a-2][d-1][0];
				onum = data[c-1][d-1][1]-data[a-2][d-1][1];
			}
		}
		else
		{
			if(b != 1)
			{
				jnum = data[c-1][d-1][0]-data[c-1][b-2][0];
				onum = data[c-1][d-1][1]-data[c-1][b-2][1];
			}
			else
			{
				jnum = data[c-1][d-1][0];
				onum = data[c-1][d-1][1];
			}
		}
		printf("%d %d %d\n",jnum,onum,(c-a+1)*(d-b+1)-jnum-onum);
	}
	return 0;
}