Problem:
すごろく

問題

JOI さんは一人ですごろく遊びをしている．
このすごろくには一直線上に N 個のマスがあり，それぞれ移動の指示が書かれている．スタート地点は 1 マス目であり，ゴールはNマス目である．
JOI さんはゴールするまで次を繰り返す．

サイコロを振って出た目の数だけ現在のマスから進み，そのマスの指示に従う．
指示に従って移動した先のマスの指示には従わない．

ちょうど N マス目に止まる時だけでなく，移動先が N マス目を超える場合もゴールとなる．

すごろくの盤面と， M 回分のサイコロの出る目が与えられたとき，サイコロを何回振ったところでゴールするかを出力するプログラムを作成せよ．

入力

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

各データセットは 1+N+M 行からなる．

入力の 1 行目には２つの整数 N,M （2 ≤ N ≤ 1000 ，1 ≤ M ≤ 1000 ）が空白を区切りとして書かれている．
N はすごろくのマス目の個数を， M は与えられるサイコロの目の個数を表す．

続く N 行には -999 以上 999 以下の整数が１つずつ書かれている．
1+i 行目 （ 1 ≤ i ≤ N ） の整数は，すごろくの i 番目のマスの指示を表す．
書かれている整数を X とする．
X=0 のときは「何もしない」を， X>0 のときは「 X マス進む」を，X<0 のときは「 |X| マス戻る」の指示を表す．ただし， |X| は X の絶対値を表す．

続く M 行には 1 以上 6 以下の整数が１つずつ書かれており， 1+N+j 行目 （ 1 ≤ j ≤ M ）の数は j 回目に出るサイコロの目を表す．

ただし， 2 行目と 1+N 行目の数は必ず 0 である．
1 マス目よりも前のマスに移動させる指示が書かれているマスはない．
また，どの採点用入力データにおいてもサイコロを振る回数が M 以下でゴールできる．

N, M がともに 0 のとき入力の終了を示す.データセットの数は 5 を超えない．

出力

データセットごとに，サイコロを何回振ったところでゴールするかを表す整数を 1 行に出力する．

入出力例

入力例

10 5
0
0
5
6
-3
8
1
8
-4
0
1
3
5
1
5
10 10
0
-1
-1
4
4
-5
0
1
-6
0
1
5
2
4
6
5
5
4
1
6
0 0

出力例

5
6

次の図は1つ目の入力例を表す．

次の図は2つ目の入力例を表す．

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

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.util.StringTokenizer;

class Main{
	public static void main(String[] args) {
		SC sc=new SC(System.in);
		while(true) {
			int N=sc.nextInt();
			int M=sc.nextInt();
			if(N*M==0) {
				System.exit(0);
			}
			else {
				int[] event=new int[N];
				for(int i=0; i<N; i++) {
					event[i]=sc.nextInt();
				}
				int[] saikoro=new int[M];
				for(int i=0; i<M; i++) {
					saikoro[i]=sc.nextInt();
				}
				int koma=0;
				for(int i=0; i<M; i++) {
					if(koma+saikoro[i]<N-1) {
						if(koma+saikoro[i]+event[koma+saikoro[i]]>=N-1) {
							pl(i+1);
							break;
						}
						else {
							koma=koma+saikoro[i]+event[koma+saikoro[i]];
						}
					}
					else {
						pl(i+1);
						break;
					}
				}
			}
		}
	}
	public static void pl(Object o) {
		System.out.println(o);
	}
	public static void pl() {
		System.out.println();
	}
	public static void p(Object o) {
		System.out.print(o);
	}
	static void quick_sort(int[][] d, int left, int right) {
		if (left>=right) {
			return;
		}
		int p = d[(left+right)/2][0];
		int l = left, r = right;
		int tmp,tmp1,tmp2;
		while(l<=r) {
			while(d[l][0] < p) { l++; }
			while(d[r][0] > p) { r--; }
			if (l<=r) {
				tmp = d[l][0]; d[l][0] = d[r][0]; d[r][0] = tmp;
				tmp1=d[l][1]; tmp2=d[r][1]; d[l][1]=tmp2; d[r][1]=tmp1;
				l++; r--;
			}
		}
		quick_sort(d, left, r);
		quick_sort(d, l, right);
	}
	static class SC {
		private BufferedReader reader = null;
		private StringTokenizer tokenizer = null;
		public SC(InputStream in) {
			reader = new BufferedReader(new InputStreamReader(in));
		}
		public String next() {
			if (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(reader.readLine());
				} catch (IOException e) {
					throw new UncheckedIOException(e);
				}
			}
			return tokenizer.nextToken();
		}
		public int nextInt() {
			return Integer.parseInt(next());
		}
		public long nextLong() {
			return Long.parseLong(next());
		}
		public double nextDouble() {
			return Double.parseDouble(next());
		}
		public String nextLine() {
			try {
				return reader.readLine();
			} catch (IOException e) {
				throw new UncheckedIOException(e);
			}
		}
	}
}