Analyzing Login/Logout Records

2年前に,時間切れになったやつだね.たしか,break するタイミングが1つ遅かったのが原因だった気がします.
学生ごとにテーブルを用意してやって,true の時間を数えます.

#include <iostream>
#include <fstream>
using namespace std;

#define TIME 720

int main()
{
	//
	//	ファイル
	//
	ifstream fin("a.in");
	ofstream fout("a.out");

	//
	//	入力
	//
	while(true)
	{
		int pc, stu;
		fin >> pc >> stu;
		//cout << pc << " " << stu << endl;
		if(pc == 0 && stu == 0)
			break;

		//	利用記録
		int r;
		fin >> r;
		//cout << r << endl;

		int (*log)[TIME]= new int[stu+1][TIME];	//	利用記録
		int *f = new int [stu+1];	//	生徒のログインフラグ
		//	初期化
		for(int i = 0; i < stu+1; i++)
		{
			for(int j = 0; j < TIME; j++)
			{
				log[i][j] = false;
			}
		}
		for(int i = 0; i < stu+1; i++)
		{
			f[i] = 0;
		}
		//	利用記録をとる
		//	log[学生番号][時間(true-logon,false-logout)]
		for(int i = 0; i < r; i++)
		{
			int t, n, m, s;
			fin >> t >> n >> m >> s;
			//cout << t << " " << n << " " << m << " " << s << endl;
			
			if(s == 1)
			{
				f[m]++;
			}
			else
			{
				f[m]--;
			}

			if(f[m] > 0)
			{
				for(int j = t - 540; j < TIME; j++)
				{
					log[m][j] = true;
				}
			}
			else
			{
				for(int j = t - 540; j < TIME; j++)
				{
					log[m][j] = false;
				}
			}
		}

		//
		//	質問
		//
		int q;
		fin >> q;
		//cout << q << endl;

		for(int k = 0; k < q; k++)
		{
			int ts, te, m;
			fin >> ts >> te >> m;
			//cout << ts << " " << te  << " "<< m << endl;

			int c = 0;
			for(int i = ts-540; i < te-540; i++)
			{
				if(log[m][i])
				{
					c++;
					//cout << i+540 << " " << c << endl;
				}
			}

			cout << c << endl;

			fout << c << endl;
		}

		delete[] log;
	}

	//
	//	後片付け
	//
	fin.close();
	fout.close();

	return 0;
}