#pragma GCC optimize("O3,unroll-loops")
#pragma  GCC target("avx,sse,sse2,sse3")
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

// mt19937 RND(137);
//
// struct Node {
//     int Time;
//     int col;
//     int cnt;
//     int Y;
//     Node *left;
//     Node *right;
//
//     Node() : Time(0), col(-1), cnt(0), Y(RND()), left(nullptr), right(nullptr) {};
//
// };

// Node* merge(Node* r1,Node *r2) {
//     if (r1 == nullptr) {
//         return r2;
//     }
//     if (r2 == nullptr) {
//         return r1;
//     }
//
//     if (r1->Y > r2->Y) {
//         r1->right = merge(r1->right,r2);
//
//     }else {
//         r2->left = merge(r1,r2->left);
//     }
//
//
// }

const ll MOD = 998244353;

void solve() {
    int N = 1000;
    vector<vector<ll>> vec(N+1,vector<ll>(N+1,ll(1)));

    for (int i=1;i<=N;i++) {
        for (int j=1;j<=N;j++) {
            vec[i][j] = vec[i][j-1] * i % MOD;
        }
    }

    // for (auto v : vec) {
    //     for (auto i : v) {
    //         cout << i << ' ';
    //     }cout << endl;
    // }cout << endl;

    int n,q;
    cin >> n >> q;

    vector<ll> a(n);
    for (int i=0;i<n;i++) {
        cin >> a[i];
    }

    while (q--) {
        int t;
        cin >> t;
        vector<ll> b(n);
        if (t == 1) {
            for (int i=0;i<n;i++) {
                b[i] = a[n-i-1];
            }
        }else if (t == 2){
            for (int i=0;i<n;i++) {
                b[i] = n - a[i] + 1;
            }
        }else {
            for (int i=0;i<n;i++) {
                b[a[i]-1] = i + 1;
            }
        }

        swap(a,b);

        ll ans = 0;
        for (int i=0;i<n;i++) {
            ans += vec[a[i]][i+1];
            if (ans >= MOD) {
                ans -= MOD;
            }
        }
        cout << ans << ' ';
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int TTT;
    // cin >> TTT;
    TTT = 1;

    while (TTT--) {
        solve();
    }
}