#include #define all(vec) vec.begin(), vec.end() #define pb push_back #define eb emplace_back #define fi first #define se second using namespace std; using ll = long long; using P = pair; template using V = vector; template inline void chmin(T &a, const T &b) { a = min(a, b); } template inline void chmax(T &a, const T &b) { a = max(a, b); } template inline bool kbit(const T &x, const int &k) { return ((x >> k) & 1LL); } inline int popcount(const int &n) { return __builtin_popcount(n); } inline ll popcountll(const ll &n) { return __builtin_popcountll(n); } template void zip(V &v) { sort(all(v)); v.erase(unique(all(v)), v.end()); } void dump() { cerr << '\n'; } template void dump(Head &&head, Tail &&... tail) { cerr << head << (sizeof...(Tail) == 0 ? " " : ", "); dump(std::move(tail)...); } template void print(const vector &v) { for (int i = 0; i < v.size(); i++) cout << v[i] << (i + 1 == v.size() ? '\n' : ' '); } template void read(vector &v) { for (int i = 0; i < v.size(); i++) cin >> v[i]; } constexpr char sp = ' ', newl = '\n'; constexpr int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}; constexpr ll INF = (1LL << 30) - 1LL; constexpr ll MOD = 998244353LL; //from http://noshi91.hatenablog.com/entry/2019/03/31/174006 template class modint { using u64 = std::uint_fast64_t; public: u64 a; constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {} constexpr u64 &value() noexcept { return a; } constexpr const u64 &value() const noexcept { return a; } constexpr modint operator+(const modint rhs) const noexcept { return modint(*this) += rhs; } constexpr modint operator-(const modint rhs) const noexcept { return modint(*this) -= rhs; } constexpr modint operator*(const modint rhs) const noexcept { return modint(*this) *= rhs; } constexpr modint operator/(const modint rhs) const noexcept { return modint(*this) /= rhs; } constexpr modint operator^(const u64 rhs) const noexcept { return modint(*this) ^= rhs; } constexpr modint &operator+=(const modint rhs) noexcept { a += rhs.a; if (a >= Modulus) { a -= Modulus; } return *this; } constexpr modint &operator-=(const modint rhs) noexcept { if (a < rhs.a) { a += Modulus; } a -= rhs.a; return *this; } constexpr modint &operator*=(const modint rhs) noexcept { a = a * rhs.a % Modulus; return *this; } constexpr modint &operator/=(modint rhs) noexcept { u64 exp = Modulus - 2; while (exp) { if (exp % 2) { *this *= rhs; } rhs *= rhs; exp /= 2; } return *this; } constexpr modint &operator^=(u64 exp) { modint rhs = modint(*this); a = 1; while (exp) { if (exp % 2) { *this *= rhs; } rhs *= rhs; exp /= 2; } return *this; } friend ostream &operator<<(ostream &os, const modint &x) { os << x.a; return os; } friend istream &operator>>(istream &is, modint &x) { is >> x.a; return is; } }; using mint = modint; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; V a(n); read(a); sort(all(a)); reverse(all(a)); V> dp(n + 1, V(n + 1)); dp[0][0] = 1; for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { dp[i + 1][j + 1] += dp[i][j]; dp[i + 1][j] += dp[i][j] * mint(a[i] - 1); } } V s(n + 1, 1); for (int i = n - 1; i >= 0; i--) { s[i] = s[i + 1] * a[i]; } while (q--) { int l, r, p; cin >> l >> r >> p; int id = r; ll res = 0; for (int i = 0; i < n; i++) { while (id >= l && id > a[i]) { res ^= (dp[i][p] * s[i]).a; --id; } } while (id >= l) { res ^= dp[n][p].a; --id; } cout << res % MOD << newl; } }