using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); static string[] SList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => ReadLine()).ToArray(); static long[] LList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => long.Parse(ReadLine())).ToArray(); public static void Main() { Solve(); } static void Solve() { checked { var c = NList; var (n, q) = (c[0], c[1]); var a = NList; var query = NArr(q); var mod = 998_244_353; Array.Sort(a, (l, r) => r.CompareTo(l)); var dp = new long[n + 1][]; for (var i = 0; i <= n; ++i) dp[i] = new long[n + 1]; dp[0][0] = 1; for (var i = 0; i < n; ++i) { for (var j = 0; j < n; ++j) { dp[i + 1][j] = (dp[i + 1][j] + dp[i][j] * (a[i] - 1) % mod) % mod; dp[i + 1][j + 1] = (dp[i + 1][j + 1] + dp[i][j]) % mod; } } var mul = new long[n + 1]; mul[n] = 1; for (var i = n - 1; i >= 0; --i) mul[i] = mul[i + 1] * a[i] % mod; var ans = new long[q]; for (var i = 0; i < q; ++i) { var l = query[i][0]; var r = query[i][1]; var p = query[i][2]; var pos = SearchMax(0, r, a); if (pos == n || a[pos] < r) --pos; for (var j = r; j >= l; --j) { while (pos + 1 < n && a[pos + 1] >= j) ++pos; ans[i] ^= dp[pos + 1][p] * mul[pos + 1] % mod; } } WriteLine(string.Join("\n", ans)); } } static int SearchMax(int left, int max, int[] list) { if (list[left] > max) return list.Length; var ok = list.Length - 1; var ng = left - 1; while (ok - ng > 1) { var mid = (ok + ng) / 2; if (list[mid] > max) ng = mid; else ok = mid; } return ok; } }