#line 2 "/Users/noya2/Desktop/Noya2_library/template/template.hpp" using namespace std; #include #line 1 "/Users/noya2/Desktop/Noya2_library/template/inout_old.hpp" namespace noya2 { template ostream &operator<<(ostream &os, const pair &p){ os << p.first << " " << p.second; return os; } template istream &operator>>(istream &is, pair &p){ is >> p.first >> p.second; return is; } template ostream &operator<<(ostream &os, const vector &v){ int s = (int)v.size(); for (int i = 0; i < s; i++) os << (i ? " " : "") << v[i]; return os; } template istream &operator>>(istream &is, vector &v){ for (auto &x : v) is >> x; return is; } void in() {} template void in(T &t, U &...u){ cin >> t; in(u...); } void out() { cout << "\n"; } template void out(const T &t, const U &...u){ cout << t; if (sizeof...(u)) cout << sep; out(u...); } template void out(const vector> &vv){ int s = (int)vv.size(); for (int i = 0; i < s; i++) out(vv[i]); } struct IoSetup { IoSetup(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); cerr << fixed << setprecision(7); } } iosetup_noya2; } // namespace noya2 #line 1 "/Users/noya2/Desktop/Noya2_library/template/const.hpp" namespace noya2{ const int iinf = 1'000'000'007; const long long linf = 2'000'000'000'000'000'000LL; const long long mod998 = 998244353; const long long mod107 = 1000000007; const long double pi = 3.14159265358979323; const vector dx = {0,1,0,-1,1,1,-1,-1}; const vector dy = {1,0,-1,0,1,-1,-1,1}; const string ALP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string alp = "abcdefghijklmnopqrstuvwxyz"; const string NUM = "0123456789"; void yes(){ cout << "Yes\n"; } void no(){ cout << "No\n"; } void YES(){ cout << "YES\n"; } void NO(){ cout << "NO\n"; } void yn(bool t){ t ? yes() : no(); } void YN(bool t){ t ? YES() : NO(); } } // namespace noya2 #line 2 "/Users/noya2/Desktop/Noya2_library/template/utils.hpp" #line 6 "/Users/noya2/Desktop/Noya2_library/template/utils.hpp" namespace noya2{ unsigned long long inner_binary_gcd(unsigned long long a, unsigned long long b){ if (a == 0 || b == 0) return a + b; int n = __builtin_ctzll(a); a >>= n; int m = __builtin_ctzll(b); b >>= m; while (a != b) { int mm = __builtin_ctzll(a - b); bool f = a > b; unsigned long long c = f ? a : b; b = f ? b : a; a = (c - b) >> mm; } return a << std::min(n, m); } template T gcd_fast(T a, T b){ return static_cast(inner_binary_gcd(std::abs(a),std::abs(b))); } long long sqrt_fast(long long n) { if (n <= 0) return 0; long long x = sqrt(n); while ((x + 1) * (x + 1) <= n) x++; while (x * x > n) x--; return x; } template T floor_div(const T n, const T d) { assert(d != 0); return n / d - static_cast((n ^ d) < 0 && n % d != 0); } template T ceil_div(const T n, const T d) { assert(d != 0); return n / d + static_cast((n ^ d) >= 0 && n % d != 0); } template void uniq(std::vector &v){ std::sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); } template inline bool chmin(T &x, U y) { return (y < x) ? (x = y, true) : false; } template inline bool chmax(T &x, U y) { return (x < y) ? (x = y, true) : false; } template inline bool range(T l, T x, T r){ return l <= x && x < r; } } // namespace noya2 #line 8 "/Users/noya2/Desktop/Noya2_library/template/template.hpp" #define rep(i,n) for (int i = 0; i < (int)(n); i++) #define repp(i,m,n) for (int i = (m); i < (int)(n); i++) #define reb(i,n) for (int i = (int)(n-1); i >= 0; i--) #define all(v) (v).begin(),(v).end() using ll = long long; using ld = long double; using uint = unsigned int; using ull = unsigned long long; using pii = pair; using pll = pair; using pil = pair; using pli = pair; namespace noya2{ /* ~ (. _________ . /) */ } using namespace noya2; #line 2 "c.cpp" #line 2 "/Users/noya2/Desktop/Noya2_library/math/prime.hpp" #line 4 "/Users/noya2/Desktop/Noya2_library/math/prime.hpp" namespace noya2 { constexpr long long safe_mod(long long x, long long m) { x %= m; if (x < 0) x += m; return x; } constexpr long long pow_mod_constexpr(long long x, long long n, int m) { if (m == 1) return 0; unsigned int _m = (unsigned int)(m); unsigned long long r = 1; unsigned long long y = safe_mod(x, m); while (n) { if (n & 1) r = (r * y) % _m; y = (y * y) % _m; n >>= 1; } return r; } constexpr bool is_prime_constexpr(int n) { if (n <= 1) return false; if (n == 2 || n == 7 || n == 61) return true; if (n % 2 == 0) return false; long long d = n - 1; while (d % 2 == 0) d /= 2; constexpr long long bases[3] = {2, 7, 61}; for (long long a : bases) { long long t = d; long long y = pow_mod_constexpr(a, t, n); while (t != n - 1 && y != 1 && y != n - 1) { y = y * y % n; t <<= 1; } if (y != n - 1 && t % 2 == 0) { return false; } } return true; } template constexpr bool is_prime_flag = is_prime_constexpr(n); // {gcd(a, b), a^{-1} mod b} constexpr std::pair inv_gcd(long long a, long long b) { a = safe_mod(a, b); if (a == 0) return {b, 0}; long long s = b, t = a; long long m0 = 0, m1 = 1; while (t) { long long u = s / t; s -= t * u; m0 -= m1 * u; auto tmp = s; s = t; t = tmp; tmp = m0; m0 = m1; m1 = tmp; } if (m0 < 0) m0 += b / s; return {s, m0}; } constexpr int primitive_root_constexpr(int m) { if (m == 2) return 1; if (m == 167772161) return 3; if (m == 469762049) return 3; if (m == 754974721) return 11; if (m == 998244353) return 3; int divs[20] = {}; divs[0] = 2; int cnt = 1; int x = (m - 1) / 2; while (x % 2 == 0) x /= 2; for (int i = 3; (long long)(i)*i <= x; i += 2) { if (x % i == 0) { divs[cnt++] = i; while (x % i == 0) { x /= i; } } } if (x > 1) { divs[cnt++] = x; } for (int g = 2;; g++) { bool ok = true; for (int i = 0; i < cnt; i++) { if (pow_mod_constexpr(g, (m - 1) / divs[i], m) == 1) { ok = false; break; } } if (ok) return g; } } template constexpr int primitive_root_flag = primitive_root_constexpr(m); // constexpr long long primitive_root_constexpr(long long m){ // if (m == (1LL << 47) - (1LL << 24) + 1) return 3; // return primitive_root_constexpr(static_cast(m)); // } } // namespace noya2 #line 4 "c.cpp" #line 2 "/Users/noya2/Desktop/Noya2_library/utility/modint_64bit.hpp" #line 4 "/Users/noya2/Desktop/Noya2_library/utility/modint_64bit.hpp" namespace noya2{ /* see : https://nyaannyaan.github.io/library/modint/arbitrary-montgomery-modint.hpp */ template struct ArbitraryLazyMontgomeryModIntBase { using mint = ArbitraryLazyMontgomeryModIntBase; inline static UInt _mod; inline static UInt r; inline static UInt n2; static constexpr int bit_length = sizeof(UInt) * 8; static UInt get_r(){ UInt ret = _mod; while (_mod * ret != 1) ret *= UInt(2) - _mod * ret; return ret; } static void set_mod(UInt m){ assert(m < (UInt(1u) << (bit_length - 2))); assert((m & 1) == 1); _mod = m, n2 = -ULong(m) % m, r = get_r(); } UInt a; ArbitraryLazyMontgomeryModIntBase() : a(0) {} ArbitraryLazyMontgomeryModIntBase(const Long &b) : a(reduce(ULong(b % _mod + _mod) * n2)) {} static UInt reduce(const ULong &b){ return (b + ULong(UInt(b) * UInt(-r)) * _mod) >> bit_length; } mint &operator+=(const mint &b){ if (Int(a += b.a - 2 * _mod) < 0) a += 2 * _mod; return *this; } mint &operator-=(const mint &b){ if (Int(a -= b.a) < 0) a += 2 * _mod; return *this; } mint &operator*=(const mint &b){ a = reduce(ULong(a) * b.a); return *this; } mint &operator/=(const mint &b){ *this *= b.inv(); return *this; } mint operator+(const mint &b) const { return mint(*this) += b; } mint operator-(const mint &b) const { return mint(*this) -= b; } mint operator*(const mint &b) const { return mint(*this) *= b; } mint operator/(const mint &b) const { return mint(*this) /= b; } bool operator==(const mint &b) const { return (a >= _mod ? a - _mod : a) == (b.a >= _mod ? b.a - _mod : b.a); } bool operator!=(const mint &b) const { return (a >= _mod ? a - _mod : a) != (b.a >= _mod ? b.a - _mod : b.a); } mint operator-() const { return mint(0) - mint(*this); } mint operator+() const { return mint(*this); } mint pow(ULong n) const { mint ret(1), mul(*this); while (n > 0){ if (n & 1) ret *= mul; mul *= mul, n >>= 1; } return ret; } friend std::ostream &operator<<(std::ostream &os, const mint &b){ return os << b.val(); } friend std::istream &operator>>(std::istream &is, mint &b){ Long t; is >> t; b = ArbitraryLazyMontgomeryModIntBase(t); return (is); } mint inv() const { Int x = val(), y = mod(), u = 1, v = 0; while (y > 0){ Int t = x / y; std::swap(x -= t * y, y); std::swap(u -= t * v, v); } return mint{u}; } UInt val() const { UInt ret = reduce(a); return ret >= _mod ? ret - _mod : ret; } static UInt mod() { return _mod; } }; // id に適当な乱数を割り当てて使う template using ArbitraryLazyMontgomeryModInt = ArbitraryLazyMontgomeryModIntBase; template using ArbitraryLazyMontgomeryModInt64bit = ArbitraryLazyMontgomeryModIntBase; template using modint64bit = ArbitraryLazyMontgomeryModInt64bit; } // namespace noya2 #line 6 "c.cpp" using mint = modint64bit<628>; using pml = pair; vector make(vector a, ll m){ int n = a.size(); vector ret; rep(i,n-1){ if (m == 0) break; mint l = a[i].first; mint r = a[i+1].first; ll cnt = (r - l - a[i].second).val(); // assert(cnt >= 0); if (cnt == 0) continue; if (cnt <= m){ ret.emplace_back(l+a[i].second,cnt); m -= cnt; } else { ret.emplace_back(l+a[i].second,m); m = 0; } } if (m > 0){ ret.emplace_back(a.back().first+a.back().second,m); } return ret; } ll access(vector a, ll x){ for (auto [l, c] : a){ if (c <= x){ x -= c; continue; } return (l + x).val() % mod998; } abort(); } void solve(){ mint::set_mod(mod998*3); int n, q; in(n,q); assert(n <= 3000 && q <= 3000); vector a; { vector b(n); in(b); uniq(b); n = b.size(); a.reserve(n); rep(i,n){ a.emplace_back(b[i],1); } } auto query = [&](ll k, ll m){ a = make(a, m); k--; // out(a); if (k == 0) return ; auto b = make(a, m); if (b.size()+1u == a.size()){ a = make(b, m); k--; swap(a, b); // out("?"); } if (k == 0) return ; int asz = a.size(); int bsz = b.size(); assert(bsz == asz); ll krem = k % (asz + bsz); ll kquo = k / (asz + bsz); // out(a); // out(b); vector na(a.begin()+krem/2,a.end()); rep(i,krem/2){ auto [l, c] = a[i]; na.emplace_back(l+2*m,c); } if (krem % 2 != 0){ na = make(na, m); // out("?"); } swap(a, na); mint geta = mint(kquo) * mint(2*m); for (auto &[l, c] : a){ l += geta; } }; while (q--){ ll k, x, m; in(k,x,m); x--; query(k,m); // out(a); out(access(a,x)); } } int main(){ int t = 1; //in(t); while (t--) { solve(); } }