#include <bits/stdc++.h>

using namespace std;

#define int ll
#define endl '\n'

typedef long long ll;

const int MOD = 998244353;

int binpow(int a, int n) {
    if (n == 0)
        return 1;
    if (n % 2 == 0) {
        int ans = binpow(a, n / 2);
        return (ans * ans) % MOD;
    } else {
        return (binpow(a, n - 1) * a) % MOD;
    }
}

const int MAXBB = 3;
const int MAXB = 2;
int ann[MAXBB][MAXBB][MAXB];

void solve() {
#ifdef LOCAL
    cout << "___NEW___" << endl;
#endif
    int n, q;
    cin >> n >> q;
    vector<int> p(n);
    vector<int> b(q);
    for (int i = 0; i < n; i++) {
        cin >> p[i];
    }
    for (int i = 0; i < q; i++) {
        cin >> b[i];
    }
#ifndef LOCAL
    if (max(n, q) <= 1000) {
        for (int _ = 0; _ < q; _++) {
            if (b[_] == 1) {
                reverse(p.begin(), p.end());
            } else if (b[_] == 2) {
                for (int i = 0; i < n; i++) {
                    p[i] = n - p[i] + 1;
                }
            } else {
                vector<int> pp(n);
                for (int i = 0; i < n; i++) {
                    pp[p[i] - 1] = i + 1;
                }
                pp.swap(p);
            }
            // cout << ann[ff][ss][tt] << ' ';
            int ans = 0;
            for (int i = 0; i < n; i++) {
                ans += binpow(p[i], i + 1);
                ans %= MOD;
            }
            cout << ans << ' ';
        }
        cout << endl;
        return;
    }
#endif
    for (int _ = 0; _ < 2; _++) {
        for (int __ = 0; __ < 2; __++) {
            vector<int> qqq = p;
            for (int ___ = 0; ___ < MAXB; ___++) {
                int ans = 0;
                for (int i = 0; i < n; i++) {
                    ans += binpow(p[i], i + 1);
                    ans %= MOD;
                }
                ann[_][__][___] = ans;
                vector<int> pp(n);
                for (int i = 0; i < n; i++) {
                    pp[p[i] - 1] = i + 1;
                }
                pp.swap(p);
            }
            qqq.swap(p);
            for (int i = 0; i < n; i++) {
                p[i] = n - p[i] + 1;
            }
        }
        reverse(p.begin(), p.end());
        // vector<int> pp(n);
        // for (int i = 0; i < n; i++) {
        //     pp[p[i] - 1] = i + 1;
        // }
        // pp.swap(p);
    }
    int ff = 0;
    int ss = 0;
    int tt = 0;
    for (int _ = 0; _ < q; _++) {
        if (b[_] == 1) {
            ff = (ff + 1) % 2;
            // reverse(p.begin(), p.end());
        } else if (b[_] == 2) {
            ss = (ss + 1) % 2;
            // for (int i = 0; i < n; i++) {
            //     p[i] = n - p[i] + 1;
            // }
        } else {
            tt = (tt + 1) % 2;
            // vector<int> pp(n);
            // for (int i = 0; i < n; i++) {
            //     pp[p[i] - 1] = i + 1;
            // }
            // pp.swap(p);
        }
        cout << ann[ff][ss][tt] << ' ';
        // int ans = 0;
        // for (int i = 0; i < n; i++) {
        //     ans += binpow(p[i], i + 1);
        //     ans %= MOD;
        // }
        // cout << ans << ' ';
    }
    cout << endl;
}

signed main() {
#ifdef LOCAL
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int qwe = 1;
#ifdef LOCAL
    cin >> qwe;
#endif
    for (int _ = 0; _ < qwe; _++) {
        solve();
    }
    return 0;
}