func_code_string: #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) {     if (lz[node] == 1) return;     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;   }   