コード
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] C = new int[N]; boolean[] A = new boolean[N]; for (int i = 1; i < N; i++) { C[i] = sc.nextInt(); A[i] = sc.nextInt() % 2 == 1; } sc.close(); SegTree segTree = new SegTree(N); segTree.update(0, 0); int ans = 0; for (int i = 1; i < N; i++) { int grundy = segTree.searchGrundy(i, C[i]); segTree.update(grundy, i); if (A[i]) { ans ^= grundy; } } if (ans == 0) { System.out.println("Second"); } else { System.out.println("First"); } } } class SegTree { int N; int[] seg; public SegTree(int N) { this.N = Integer.highestOneBit(N) * 2; seg = new int[this.N * 2]; Arrays.fill(seg, -1); } public void update(int grundy, int i) { grundy += N - 1; seg[grundy] = i; while (grundy > 0) { grundy = (grundy - 1) / 2; seg[grundy] = Math.min(seg[grundy * 2 + 1], seg[grundy * 2 + 2]); } } public int searchGrundy(int i, int C) { int grundy = 0; while (N - grundy > 1) { grundy = grundy * 2 + 1; if (seg[grundy] >= i - C) { grundy++; } } return grundy - (N - 1); } }