Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

H: ジャンプパーティ

問題

とあるダンスホールで $N$ 人の参加するダンスパーティーが行われる。
そのダンスホールは縦方向に $H$ 個、横方向に $W$ 個のグリッドに分けられており、
左上を $(0,0)$、上から $r$ マス、左から $c$ マス目のグリッドの座標を $(r,c)$ と表す。
$i$ 番目の参加者の初期位置は $(R_i, C_i)$ であり、$(i,j)$ のグリッドには $(r_{ij}, c_{ij})$ が書かれている。

各参加者は、無限に続く音楽に合わせて次のように同時に移動を行う。

その時にいる座標が $(i,j)$ のとき、$(r_{ij}, c_{ij})$ へジャンプで移動する。

それぞれのグリッドは狭く、2 人以上の参加者が同時に同じグリッドに移動すると衝突してしまう。ただし、空中で衝突することは無いとする。
これを聞いたあなたは、ジャンプ後に 2 人以上の参加者が衝突してしまわないかと心配になった。
そこで、衝突が起こる可能性があるか、あるならば何回目のジャンプの後に衝突が起こるかを求めることにした。

制約

$1 \le H,W \le 500$

$0 \le N \le H \times W$

$0 \le r_{ij} < H \ (0 \le i < H, 0 \le j < W)$

$0 \le c_{ij} < W \ (0 \le i < H, 0 \le j < W)$

$0 \le R_i < H \ (0 \le i < N)$

$0 \le C_i < W \ (0 \le i < N)$

参加者の初期位置は相異なる

入力形式

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

$H \ W \ N$

$r_{00} \ c_{00} \ \cdots \ r_{0 \ W-1} \ c_{0 \ W-1}$

$\vdots$

$r_{H-1 \ 0} \ c_{H-1 \ 0} \ \cdots \ r_{H-1 \ W-1} \ c_{H-1 \ W-1}$

$R_0 \ C_0$

$\vdots$

$R_{N-1} \ C_{N-1}$

この問題では入力ファイルが非常に大きくなることがあることに注意せよ。
C++ ならこのページを参考にすると良いかもしれない。

出力

衝突が起こる場合は何回目のジャンプの後に起こるかを 1 行で出力せよ。
そうでない場合は -1 を出力せよ。
また、末尾に改行を出力せよ。

サンプル

サンプル入力 1

2 2 2
1 0 0 1
0 0 1 0
0 0
0 1

サンプル出力 1

-1

サンプル入力 2

2 2 2
1 0 0 1
0 0 1 0
0 0
1 1

サンプル出力 2

1

Solution in Scala (judge verdict: Runtime Error)

object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val Array(h, w, n) = readLine.trim.split(' ').map(_.toInt)
  val floor = Array.tabulate(h){_ ⇒
    val line = readLine.trim.split(' ').map(_.toInt)
    (for (i ← 0 until line.length by 2) yield {
      (line(i), line(i + 1))
    }).toArray
  }
  val memo = RichArray(Array.tabulate(h){_ ⇒ Array.tabulate(w){_ ⇒ false}})
  val person = Array.tabulate(n){_ ⇒
    val Array(r, c) = readLine.trim.split(' ').map(_.toInt)
    (r, c)
  }
  var isCollide: Option[Int] = None
  for (count ← 1 to h * w if isCollide.isEmpty){
    for (i ← person.indices){
      person(i) = floor(person(i))
      if (memo(person(i))) isCollide = Some(count)
      memo(person(i)) = true
    }
    for (p ← person){
      memo(p) = false
    }
  }
  println(
    isCollide match {
      case Some(c) ⇒ c
      case None ⇒ -1
    }
  )


  implicit class RichArray[T](val array: Array[Array[T]]) {
    def apply(coordinate: (Int, Int)): T = array(coordinate._1)(coordinate._2)
    def update(coordinate: (Int, Int), value: T) = array(coordinate._1)(coordinate._2) = value
  }
  implicit class Extension[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}