#include <bits/stdc++.h>

using namespace std;
void solve();

template<typename T, typename T1> T remax(T& x, T1 y) { if (x < y) x = y; return x; }
template<typename T, typename T1> T remin(T& x, T1 y) { if (y < x) x = y; return x; }

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
//    cin >> t;
    while (t--) solve();
}
#define int int64_t

const int mod = 998244353;

int binpow(int n, int k) {
    int rs = 1;
    while (k) {
        if (k & 1) rs = rs * n % mod;
        n = n * n % mod;
        k >>= 1;
    }
    return rs;
}

void solve() {
    int n, q; cin >> n >> q;
    vector<int> p(n);
    for (auto& x : p) cin >> x;
//    set<vector<int>> s;
////    vector<int> cur(15);
//    auto rec = [&](auto& self, int i, vector<int> a) {
//        if (i == 13) return;
//        s.emplace(a);
//        vector<int> z = a;
//        std::reverse(z.begin(), z.end());
//        self(self, i + 1, z);
//        z = a;
//        for (int k = 0; k < n; ++k) z[k] = n + 1 - z[k];
//        self(self, i + 1, z);
//        for (int k = 0; k < n; ++k) z[a[k] - 1] = k + 1;
//        self(self, i + 1, z);
//    };
//    rec(rec, 0, p);

//    set<vector<int>> s2;
    map<vector<int>, int> s2;
    vector<int> ans(8);
    for (int mask = 0; mask < 8; ++mask) {
        vector<int> a = p;
        if (mask & 1) {
            std::reverse(a.begin(), a.end());
        }
        if (mask >> 1 & 1) {
            for (int i = 0; i < n; ++i) a[i] = n + 1 - a[i];
        }
        if (mask >> 2 & 1) {
            vector<int> z(n);
            for (int i = 0; i < n; ++i) z[a[i] - 1] = i + 1;
            a = z;
        }
//        s2.emplace(a);
        int cur = 0;
        for (int i = 0; i < n; ++i) cur = (cur + binpow(a[i], i + 1)) % mod;
        ans[mask] = cur;
        s2[a] = mask;
    }
//    for (auto& x : s2) {
//        for (auto& y : x) cout << y << ' ';
//        cout << '\n';
//    }
    int mask = 0;
    while (q--) {
        int t; cin >> t;
//        --t;
        int wt = t;
        if (t < 3) {
            if (mask >> 2 & 1) t = 3 - t;
        }
        mask ^= 1 << t - 1;
        t = wt;
//        cout << ans[mask] << ' ';
//        if (t == 1) {
//            std::reverse(p.begin(), p.end());
//        } else if (t == 2) {
//            for (int i = 0; i < n; ++i) p[i] = n + 1 - p[i];
//        } else {
//            vector<int> z(n);
//            for (int i = 0; i < n; ++i) z[p[i] - 1] = i + 1;
//            p = z;
//        }
//        assert(s2.count(p));
//        cout << ans[s2[p]] << ' ';
//        cout << mask << ' ' << s2[p] << '\n';
        cout << ans[mask] << ' ';
    }
}