Problem:
ワカサギ釣り大会 2

桧原湖でワカサギ釣り大会が行われました。今回はキャッチ＆リリースが推奨されているようです。

参加者番号と釣った匹数またはリリースした匹数を１つのイベントとして順番に読み込み、各イベントの直後に最も多くのワカサギを手元に獲得している参加者番号と匹数を出力するプログラムを作成してください。最も多く獲得している参加者が複数いる場合（あるいは全ての参加者が 0 匹の場合）は、その中で参加者番号が最も小さい一人を出力してください。

入力

入力は以下の形式で与えられる。

n q
a1 v1
a2 v2
:
aq vq

n (1 ≤ n ≤ 1000000) は参加者の数、q (1 ≤ q ≤ 100000)はイベントの数を表す。ai (1 ≤ ai ≤ n)   vi ( -100 ≤ vi ≤ 100) は、i 番目のイベントで参加者 ai が vi 匹獲得あるいはリリースしたことを示す。vi は正の値が獲得、負の値がリリースを示し、0 が与えられることはない。

出力

各イベントごとに、最も多くのワカサギを手元に獲得している参加者の参加者番号と匹数を１つの空白区切りで１行に出力する。

入力例1

3 5
1 4
2 5
1 3
3 6
2 7

出力例1

1 4
2 5
1 7
1 7
2 12

入力例2

3 5
1 4
2 5
2 -3
3 4
1 -1

出力例2

1 4
2 5
1 4
1 4
3 4

Solution in JAVA (judge verdict: Memory Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class Main {
	public static void main(String[] args) throws IOException {
		try (BufferedReader input = new BufferedReader(new InputStreamReader(System.in))) {
			final String[] datasize = input.readLine().split(" ");
			final int personCount = Integer.parseInt(datasize[0]);
			final int eventCount = Integer.parseInt(datasize[1]);

			int[] sumArray = new int[personCount + 1];
			Arrays.fill(sumArray, 0);
			while (input.ready()) {
				final String[] event = input.readLine().split(" ");
				final int personNum = Integer.parseInt(event[0]);
				final int eventNum = Integer.parseInt(event[1]);
				sumArray[personNum] += eventNum;
				int[] ans = getMaxPersonData(sumArray);

				System.out.println(ans[0] + " " + ans[1]);
			}
		}
	}

	public static int[] getMaxPersonData(int[] array) {
		ArrayList<FishingContest> list = new ArrayList<>();
		for (int i = 0; i < array.length; i++) {
			list.add(new FishingContest(i, array[i]));
		}
		FishingContest max = Collections.max(list, new FishingContestComparator());
		int[] ret = { max.getPersonNum(), max.getFishCount() };
		return ret;
	}

	static class FishingContest {
		private int personNum;
		private int fishCount;

		public FishingContest(int personNum) {
			this.personNum = personNum;
			this.fishCount = 0;
		}

		public FishingContest(int personNum, int eventCount) {
			this.personNum = personNum;
			this.fishCount = eventCount;
		}

		public void catchFish(int count) {
			this.fishCount += count;
		}

		public int getPersonNum() {
			return this.personNum;
		}

		public int getFishCount() {
			return this.fishCount;
		}
	}

	static class FishingContestComparator implements Comparator<FishingContest> {

		@Override
		public int compare(FishingContest o1, FishingContest o2) {
			final int o1_count = o1.getFishCount();
			final int o2_count = o2.getFishCount();

			if (o1_count > o2_count) {
				return 1;
			} else if (o1_count == o2_count) {
				return 0;
			} else {
				return -1;
			}
		}
	}
}