#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma comment(linker, "/STACK:2000000")
using namespace std;
template <int D, typename T>
struct Vec : public vector<Vec<D - 1, T>> {
  static_assert(D >= 1, "Vector dimension must be greater than zero!");
  template <typename... Args>
  Vec(int n = 0, Args... args)
      : vector<Vec<D - 1, T>>(n, Vec<D - 1, T>(args...)) {}
};
template <typename T>
struct Vec<1, T> : public vector<T> {
  Vec(int n = 0, T val = T()) : vector<T>(n, val) {}
};
using ll = long long;
using db = long double;
using ii = pair<int, int>;
const int N = 2e5 + 5, LG = 19, MOD = 998244353;
const int SQ = 320;
const long double EPS = 1e-7;
void printCase(int cs) { cout << "Case #" << cs << ": "; }
int p[N], n, q;
int fast(int b, int e) {
  int res = 1;
  for (; e; e >>= 1, b = 1ll * b * b % MOD)
    if (e & 1) {
      res = 1ll * res * b % MOD;
    }
  return res;
}
int t[N << 2], lz[N << 2], cur = 1;
void build(int node, int s, int e) {
  lz[node] = 1;
  if (s == e) {
    t[node] = cur;
    cur = 1ll * cur * p[s] % MOD;
    return;
  }
  int md = (s + e) >> 1;
  build(node << 1, s, md);
  build(node << 1 | 1, md + 1, e);
  t[node] = t[node << 1] + t[node << 1 | 1];
  if (t[node] >= MOD) t[node] -= MOD;
}
void push(int node, int s, int e) {
  t[node] = 1ll * t[node] * lz[node] % MOD;
  if (s != e) {
    lz[node << 1] = 1ll * lz[node] * lz[node << 1] % MOD;
    lz[node << 1 | 1] = 1ll * lz[node] * lz[node << 1 | 1] % MOD;
  }
  lz[node] = 1;
}
int qry(int node, int s, int e, int l, int r) {
  push(node, s, e);
  if (r < s || e < l) return 0;
  if (l <= s && e <= r) return t[node];
  int md = (s + e) >> 1;
  int ret = qry(node << 1, s, md, l, r) + qry(node << 1 | 1, md + 1, e, l, r);
  if (ret >= MOD) ret -= MOD;
  return ret;
}
void upd(int node, int s, int e, int l, int r, int v) {
  push(node, s, e);
  if (r < s || e < l) return;
  if (l <= s && e <= r) {
    lz[node] = 1ll * lz[node] * v % MOD;
    push(node, s, e);
    return;
  }
  int md = (s + e) >> 1;
  upd(node << 1, s, md, l, r, v);
  upd(node << 1 | 1, md + 1, e, l, r, v);
  t[node] = t[node << 1] + t[node << 1 | 1];
  if (t[node] >= MOD) t[node] -= MOD;
}
int sum[N];
int qry(int l, int r) { return 1ll * sum[r] * fast(sum[l - 1], MOD - 2) % MOD; }
int get(int l, int r) {
  return 1ll * qry(1, 1, n, l, r) * fast(qry(l, r), MOD - 2) % MOD;
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> q;
  const int INV100 = fast(100, MOD - 2);
  sum[0] = 1;
  for (int i = 1; i < n + 1; i++) {
    cin >> p[i];
    p[i] = 1ll * p[i] * INV100 % MOD;
    sum[i] = 1ll * sum[i - 1] * p[i] % MOD;
  }
  build(1, 1, n);
  set<int> checkPoints({1, n + 1});
  int ans = get(1, n);
  while (q--) {
    int x;
    cin >> x;
    if (checkPoints.count(x)) {
      int l = *(--checkPoints.find(x));
      int r = *(checkPoints.upper_bound(x));
      ans -= get(l, x - 1);
      if (ans < 0) ans += MOD;
      ans -= get(x, r - 1);
      if (ans < 0) ans += MOD;
      int toMul = 1ll * qry(1, 1, n, x - 1, x - 1) * p[x - 1] % MOD;
      upd(1, 1, n, x, r - 1, toMul);
      ans += get(l, r - 1);
      if (ans >= MOD) ans -= MOD;
      checkPoints.erase(x);
    } else {
      int l = *(--checkPoints.upper_bound(x));
      int r = *(checkPoints.upper_bound(x));
      ans = (ans - get(l, r - 1));
      if (ans < 0) ans += MOD;
      ans += get(l, x - 1);
      if (ans >= MOD) ans -= MOD;
      int toDivide = 1ll * qry(1, 1, n, x - 1, x - 1) * p[x - 1] % MOD;
      toDivide = fast(toDivide, MOD - 2);
      upd(1, 1, n, x, r - 1, toDivide);
      ans += get(x, r - 1);
      if (ans >= MOD) ans -= MOD;
      checkPoints.insert(x);
    }
    cout << ans << '\n';
  }
  return 0;
}
