#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
const int mod=998244353;
int n,q,a[200005],b[200005],pos[200005],c[200005];
long long int otg;
long long int fast(long long int base,long long int step)
{
    long long int w=base;
    base=1;
    for(int i=0;i<30;i++)
    {
        if((1<<i)&step)
        {
            base=(base*w)%mod;
        }
        w=(w*w)%mod;
    }
    return base;
}
void dumb()
{
    for(int i=1;i<=q;i++)
    {
        otg=0;
        if(b[i]==1)
        {
            for(int i=1;i<=n/2;i++)
            {
                swap(pos[a[i]],pos[a[n-i+1]]);
                swap(a[i],a[n-i+1]);
            }
            for(int i=1;i<=n;i++)
            {
                otg=(otg+fast(a[i],i))%mod;
            }
        }
        if(b[i]==2)
        {
            for(int i=1;i<=n/2;i++)
            {
                swap(a[pos[i]],a[pos[n-i+1]]);
                swap(pos[i],pos[n-i+1]);
            }
            for(int i=1;i<=n;i++)
            {
                otg=(otg+fast(a[i],i))%mod;
            }
        }
        if(b[i]==3)
        {
            for(int i=1;i<=n;i++)
            {
                c[i]=pos[i];
            }
            for(int i=1;i<=n;i++)
            {
                pos[c[i]]=i;
                a[i]=c[i];
            }
            for(int i=1;i<=n;i++)
            {
                otg=(otg+fast(a[i],i))%mod;
            }
        }
        cout<<otg<<" ";
    }
}
void read()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        pos[a[i]]=i;
    }
    for(int i=1;i<=q;i++)
    {
        cin>>b[i];
    }
    if(n<=1000&&q<=1000)
    {
        dumb();
    }
}
int main()
{
    speed();
    read();
	return 0;
}
