Problem:
Problem B: Analyzing Login/Logout Records

You have a computer literacy course in your university. In the computer
system, the login/logout records of all PCs in a day are stored in a
file. Although students may use two or more PCs at a time, no one can
log in to a PC which has been logged in by someone who has not
logged out of that PC yet.

You are asked to write a program that calculates the total time of a
student that he/she used at least one PC in a given time period
(probably in a laboratory class) based on the records in the file.

The following are example login/logout records.

The student 1 logged in to the PC 1 at 12:55

The student 2 logged in to the PC 4 at 13:00

The student 1 logged in to the PC 2 at 13:10

The student 1 logged out of the PC 2 at 13:20

The student 1 logged in to the PC 3 at 13:30

The student 1 logged out of the PC 1 at 13:40

The student 1 logged out of the PC 3 at 13:45

The student 1 logged in to the PC 1 at 14:20

The student 2 logged out of the PC 4 at 14:30

The student 1 logged out of the PC 1 at 14:40

For a query such as "Give usage of the student 1 between 13:00 and
14:30", your program should answer "55 minutes", that is, the sum of
45 minutes from 13:00 to 13:45 and 10 minutes from 14:20 to 14:30, as
depicted in the following figure.

Input

The input is a sequence of a number of datasets.
The end of the input is indicated by a line containing two zeros
separated by a space.
The number of datasets never exceeds 10.

Each dataset is formatted as follows.

N M 

r 

record1

...

recordr 

q 

query1

...

queryq 

The numbers N  and M  in the first line are the numbers of
PCs and the students, respectively. r  is the number of
records. q  is the number of queries. These four are integers
satisfying the following.

1 ≤ N  ≤ 1000, 1 ≤ M  ≤ 10000, 2 ≤ r  ≤ 1000, 1 ≤ q  ≤ 50

Each record consists of four integers, delimited by a space, as follows.

t  n  m  s 

s  is 0 or 1.
If s  is 1, this line means that the student m  logged in
to the PC n  at time t . If s  is 0, it means that
the student m  logged out of the PC n  at time t .
The time is expressed as elapsed minutes from 0:00 of the day.
t , n  and m  satisfy the following.

540 ≤ t  ≤ 1260,
1 ≤ n  ≤ N , 1 ≤ m  ≤ M 

You may assume the following about the records.

Records are stored in ascending order of time t. 

No two records for the same PC has the same time t. 

No PCs are being logged in before the time of the first record
nor after that of the last record in the file.

Login and logout records for one PC appear alternatingly, and each of the login-logout record pairs is for the same student.

Each query consists of three integers delimited by a space, as follows.

ts  te  m 

It represents "Usage of the student m  between
ts  and te ".
ts , te  and m 
satisfy the following.

540 ≤ ts  < te  ≤ 1260,
1 ≤ m  ≤ M 

Output

For each query, print a line having a decimal integer indicating the
time of usage in minutes. Output lines should not have any character
other than this number.

Sample Input

4 2
10
775 1 1 1
780 4 2 1
790 2 1 1
800 2 1 0
810 3 1 1
820 1 1 0
825 3 1 0
860 1 1 1
870 4 2 0
880 1 1 0
1
780 870 1
13 15
12
540 12 13 1
600 12 13 0
650 13 15 1
660 12 15 1
665 11 13 1
670 13 15 0
675 11 13 0
680 12 15 0
1000 11 14 1
1060 12 14 1
1060 11 14 0
1080 12 14 0
3
540 700 13
600 1000 15
1000 1200 11
1 1
2
600 1 1 1
700 1 1 0
5
540 600 1
550 650 1
610 620 1
650 750 1
700 800 1
0 0

Output for the Sample Input

55
70
30
0
0
50
10
50
0

Solution in C (judge verdict: Wrong Answer)

#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 s4_time;
	S4 s4_PCNum;
	S4 s4_studentNum;
	U1 u1_isLogin;
}ST_RECORD;

S4 main()
{
	S4 s4_t_numPC;										/* PC数 */
	S4 s4_t_numStudent;									/* 学生数 */
	S4 s4_t_numRecord;									/* 利用記録の件数 */
	static ST_RECORD st_tp_record[MAX_NUM_RECORD];				/* 利用記録 */
	S4 s4_t_time;										/* 解析中の時刻 */
	static S4 s4_tp_numLoginPC[MAX_NUM_STUDENT];				/* 学生ごとのログイン数 */
	static U1 u1_tp_isLogin[RECORD_TIME][MAX_NUM_STUDENT];		/* ある時刻における学生ごとの利用状況 [0][m]に、開始時刻における学生mのログイン有無を記録する*/

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

	S4 s4_t_numQuestion;								/* 質問数 */
	S4 s4_t_startTime;									/* 開始時刻 */
	S4 s4_t_endTime;									/* 終了時刻 */
	S4 s4_t_studentNum;									/* 学生の番号 */
	S4 s4_t_utilizationTime;							/* 利用時間 */

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

			for (s4_t_time = (S4)0; s4_t_time < (S4)RECORD_TIME; s4_t_time++)
			{
				u1_tp_isLogin[s4_t_time][s4_t_im] = (U1)FALSE;
			}
		}

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

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

		/* 利用記録の取得 */
		for (s4_t_ir = (S4)0; s4_t_ir < s4_t_numRecord; s4_t_ir++)
		{
			(void)scanf("%d %d %d %d%c", &st_tp_record[s4_t_ir].s4_time, &st_tp_record[s4_t_ir].s4_PCNum, &st_tp_record[s4_t_ir].s4_studentNum, &st_tp_record[s4_t_ir].u1_isLogin, &u1_t_delimiter);
		}

		/* 利用記録の解析 */
		s4_t_time = (S4)START_MINUTES;
		s4_t_ir = (S4)0;
		while ((s4_t_time < (S4)END_MINUTES) &&
			(s4_t_ir < s4_t_numRecord))
		{
			/* 利用記録の時刻と一致すれば、学生ごとのログイン数を更新 */
			if (st_tp_record[s4_t_ir].s4_time == s4_t_time)
			{
				if (st_tp_record[s4_t_ir].u1_isLogin == (U1)TRUE)
				{
					s4_tp_numLoginPC[st_tp_record[s4_t_ir].s4_studentNum]++;
				}
				else
				{
					s4_tp_numLoginPC[st_tp_record[s4_t_ir].s4_studentNum]--;
				}
				s4_t_ir++;
			}

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

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

		for (s4_t_iq = (S4)0; s4_t_iq < s4_t_numQuestion; s4_t_iq++)
		{
			/* 開始・終了時刻、学生番号を取得 */
			(void)scanf("%d %d %d%c", &s4_t_startTime, &s4_t_endTime, &s4_t_studentNum, &u1_t_delimiter);

			/* 利用時間を確認 */
			s4_t_utilizationTime = (S4)0;
			for (s4_t_time = (S4)s4_t_startTime; s4_t_time < s4_t_endTime; s4_t_time++)
			{
				if (u1_tp_isLogin[s4_t_time - START_MINUTES][s4_t_studentNum] == (U1)TRUE)
				{
					s4_t_utilizationTime++;
				}
			}

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

	return((S4)(0));
}