Problem:
Problem J: Usaneko Matrix

うさぎとねこが勝負をしている. ルールは以下の通りである.

まず2 匹はそれぞれn 行n 列の正方形状にn2 個の整数を紙に書き, トランプを1 枚ずつ引く. 次に, 1 から 1 000 000 までの数が1 つずつ書かれた1 000 000 枚のカードを2 匹でシャッフルし, これを1 枚ずつ交互に引いていく. 2 匹はカードが引かれるたび, カードと同じ数が自分の紙に書かれていたらそれに印をつける. 「印がついたn 個の数の組であって, 一直線上に並んでいるもの」の個数が, はじめに引いたトランプの数以上になることを勝利条件とする.

与えられたm 枚目のカードまでで, うさぎとねこのどちらが勝つか答えよ. ただし勝敗は, あるカードが引かれて印をつけ終わった段階で2 匹のうち片方のみが勝利条件をみたしたときに決まるものとし, それ以外の場合は引き分けとする. いずれかが勝利条件をみたした後でもカードが引かれることはあるが, これは勝敗に影響しない.

Input

1 行目：“n u v m” (正方形のサイズ, うさぎのトランプの数, ねこのトランプの数, 引かれるカードの枚数) 2-(N + 1) 行目：うさぎが紙に書くn2 個の数(N + 2)-(2N + 1) 行目：ねこが紙に書くn2 個の数(2N + 2)-(2N +M + 1) 行目：引かれるm 枚のカード

1 ≤ n ≤ 500

1 ≤ u, v ≤ 13

1 ≤ m ≤ 100 000

1 ≤ (書かれる数) ≤ 1 000 000

うさぎが紙に書くn2 個の数, ねこが紙に書くn2 個の数, 引かれるm 枚のカードに書かれた数はそれぞれの中で異なる.

Output

うさぎが勝つ場合には”USAGI”を, ねこが勝つ場合には”NEKO”を, 引き分けならば”DRAW”, それぞれ
一行に出力せよ.

Sample Input 1

3 2 2 10
1 2 3
4 5 6
7 8 9
1 2 3
6 5 4
7 8 9
11
4
7
5
10
9
2
1
3
8

Sample Output 1

USAGI

Sample Input 2

3 2 1 10
1 2 3
4 5 6
7 8 9
1 2 3
6 5 4
7 8 9
11
4
7
5
10
9
2
1
3
8

Sample Output 2

DRAW

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.Arrays;
import java.util.Scanner;

//Usaneko Matrix
public class Main{
	
	void run(){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), U = sc.nextInt(), V = sc.nextInt(), m = sc.nextInt();
		int[] u = new int[1000001], v = new int[1000001];
		Arrays.fill(u, -1); Arrays.fill(v, -1);
		for(int i=0;i<n;i++)for(int j=0;j<n;j++)u[sc.nextInt()]=i*n+j;
		for(int i=0;i<n;i++)for(int j=0;j<n;j++)v[sc.nextInt()]=i*n+j;
		int[] usagiV = new int[n], usagiH = new int[n], nekoV = new int[n], nekoH = new int[n];
		int uc1 = 0, uc2 = 0, vc1 = 0, vc2 = 0;
		int ru = 0, rv = 0;
		String res = "DRAW";
		while(m--!=0){
			int x = sc.nextInt();
			if(u[x]!=-1){
				int i = u[x]/n, j = u[x]%n;
				usagiV[j]++; usagiH[i]++;
				if(i==j)uc1++;
				if(i+j==n-1)uc2++;
				if(usagiV[j]==n)ru++;
				if(usagiH[i]==n)ru++;
				if(uc1==n)ru++;
				if(uc2==n)ru++;
			}
			if(v[x]!=-1){
				int i = v[x]/n, j = v[x]%n;
				nekoV[j]++; nekoH[i]++;
				if(i==j)vc1++;
				if(i+j==n-1)vc2++;
				if(nekoV[j]==n)rv++;
				if(nekoH[i]==n)rv++;
				if(vc1==n)rv++;
				if(vc2==n)rv++;
			}
			if(U<=ru&&V<=rv)break;
			if(U<=ru){
				res = "USAGI"; break;
			}
			if(V<=rv){
				res = "NEKO"; break;
			}
		}
		System.out.println(res);
	}
	
	public static void main(String[] args) {
		new Main().run();
	}
}