アタリとハズレの累積和をそれぞれ計算しておく。0 番目の累積和として 0 を追加しておくテクニックを使ってみた。
var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var Q = int.Parse(Console.ReadLine()!); var L = new List<int>(); var R = new List<int>(); for (var i = 0; i < Q; i++) { var lr = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); L.Add(lr[0]); R.Add(lr[1]); } // 番兵(?)として 0 を登録しておく var SW = new List<int>() { 0 }; var SL = new List<int>() { 0 }; for (var i = 0; i < N; i++) { if (A[i] == 1) { SW.Add(SW[i] + 1); SL.Add(SL[i]); } else { SW.Add(SW[i]); SL.Add(SL[i] + 1); } } for (var i = 0; i < Q; i++) { var win = SW[R[i]] - SW[L[i] - 1]; var lose = SL[R[i]] - SL[L[i] - 1]; if (win > lose) { Console.WriteLine("win"); } else if (win == lose) { Console.WriteLine("draw"); } else { Console.WriteLine("lose"); } }