#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
template <class T>
inline T fast(T a, T b, T mod) {
  long long res = 1;
  while (b) {
    if (b & 1) res = (res * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return res;
}
template <class T>
inline T gcd(T a, T b) {
  while (b) swap(a %= b, b);
  return abs(a);
}
const long long mod = 998244353;
struct uamek {
  long long a, b;
  uamek(long long _a, long long _b) : a(_a), b(_b) {}
  void wypisz() {
    long long pom = gcd(a, b);
    a /= pom;
    b /= pom;
    a %= mod;
    b %= mod;
    cout << a * fast(b, mod - 2, mod) % mod << '\n';
  }
};
uamek dodaj(uamek x, uamek y) {
  return uamek(x.a % mod * y.b % mod + y.a % mod * x.b % mod, x.b * y.b);
}
void solve() {
  int n, q;
  cin >> n >> q;
  vector<int> tab(n);
  for (auto& u : tab) cin >> u;
  sort(tab.begin(), tab.end());
  long long sum = accumulate(tab.begin(), tab.end(), 0ll);
  vector<long long> pref_sum(n + 1);
  for (int i = 0; i < n; i++) pref_sum[i + 1] = pref_sum[i] + tab[i];
  for (int i = 0; i < q; i++) {
    long long a, b;
    cin >> a >> b;
    int poz = lower_bound(tab.begin(), tab.end(), b) - tab.begin();
    int na_gorze = n - poz;
    uamek na_d = uamek(1ll * pref_sum[poz] % mod * (max(0ll, na_gorze + 1 - a)),
                       na_gorze + 1);
    uamek na_g = uamek(
        1ll * (sum - pref_sum[poz]) % mod * (max(0ll, na_gorze - a)), na_gorze);
    if (na_g.b == 0) {
      na_d.wypisz();
    } else {
      uamek dodany = dodaj(na_d, na_g);
      dodany.wypisz();
    }
  }
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int t = 1;
  while (t--) {
    solve();
  }
}
