#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define MAX_NUM_PC			(1000)
#define	MAX_NUM_STUDENT		(10000)
#define	MAX_NUM_RECORD		(1000)
#define START_MINUTES		(540)
#define END_MINUTES			(1260)
#define RECORD_TIME			((END_MINUTES) - (START_MINUTES))
#define TRUE				(1)
#define FALSE				(0)

#define	S4	int
#define	U4	unsigned int
#define	U1	unsigned char

typedef struct st_record
{
	S4 time;
	S4 PCNum;
	S4 studentNum;
	U1 isLogin;
}ST_RECORD;

S4 main()
{
	S4 numPC;										/* PC数 */
	S4 numStudent;									/* 学生数 */
	S4 numRecord;									/* 利用記録の件数 */
	static ST_RECORD record[MAX_NUM_RECORD];				/* 利用記録 */
	S4 time;										/* 解析中の時刻 */
	static S4 numLoginPC[MAX_NUM_STUDENT];				/* 学生ごとのログイン数 */
	static U1 isLogin[RECORD_TIME][MAX_NUM_STUDENT];		/* ある時刻における学生ごとの利用状況 [0][m]に、開始時刻における学生mのログイン有無を記録する*/

	U1 delimiter;									/* scanfの改行を捨てるための変数 */
	S4 ir;											/* 利用記録のインデックス */
	S4 im;											/* 学生ごとのログイン数のインデックス */
	S4 iq;											/* 質問のインデックス */

	S4 numQuestion;								/* 質問数 */
	S4 startTime;									/* 開始時刻 */
	S4 endTime;									/* 終了時刻 */
	S4 studentNum;									/* 学生の番号 */
	S4 utilizationTime;							/* 利用時間 */

	while (1){
		/* 初期化 */
		for (im = (S4)0; im < (S4)MAX_NUM_STUDENT; im++){
			numLoginPC[im] = (S4)0;

			for (time = (S4)0; time < (S4)RECORD_TIME; time++){
				isLogin[time][im] = (U1)FALSE;
			}
		}

		/* PC数、学生数の取得 */
		(void)scanf("%d %d", &numPC, &numStudent);
		/* 0 0 が入力されたら終了 */
		if ((numPC == 0) && (numStudent == 0)){
			break;
		}

		/* 利用件数の取得 */
		(void)scanf("%d", &numRecord);

		/* 利用記録の取得 */
		for (ir = (S4)0; ir < numRecord; ir++){
			(void)scanf("%d %d %d %d", &record[ir].time, &record[ir].PCNum, &record[ir].studentNum, &record[ir].isLogin);
		}

		/* 利用記録の解析 */
		time = (S4)START_MINUTES;
		ir = (S4)0;
		while ((time < (S4)END_MINUTES) && (ir < numRecord)){
			/* 利用記録の時刻と一致すれば、学生ごとのログイン数を更新 */
			if (record[ir].time == time){
				if (record[ir].isLogin == (U1)TRUE){
					numLoginPC[record[ir].studentNum]++;
				}else{
					numLoginPC[record[ir].studentNum]--;
				}
				ir++;
			}

			/* 解析中の時刻における学生のログイン有無を確認 */
			for (im = (S4)0; im <= numStudent; im++){
				/* 学生imがログインしていた場合 */
				if (numLoginPC[im] >(S4)0){
					isLogin[time - START_MINUTES][im] = (U1)TRUE;
				}
			}
			time++;
		}

		/* 質問の回答 */
		/* 質問数の取得 */
		(void)scanf("%d%", &numQuestion);

		for (iq = (S4)0; iq < numQuestion; iq++){
			/* 開始・終了時刻、学生番号を取得 */
			(void)scanf("%d %d %d", &startTime, &endTime, &studentNum);

			/* 利用時間を確認 */
			utilizationTime = (S4)0;
			for (time = (S4)startTime; time < endTime; time++)
			{
				if (isLogin[time - START_MINUTES][studentNum] == (U1)TRUE)
				{
					utilizationTime++;
				}
			}

			printf("%d\n", utilizationTime);
		}
	}

	return((S4)(0));
}

