#include <bits/stdc++.h>
#define int long long
using namespace std;

unsigned long long rd(unsigned long long &x) {
	x ^= (x << 13);
	x ^= (x >> 7);
	x ^= (x << 17);
	return x;
}

const int MAXN=2e6+10,mod=998244353,P=499122177;
int ans[MAXN],out;
int a[MAXN],b[MAXN];
int n, q, x;
long long k_max;
//ll ex_pow(ll x,ll y)
//{
//	ll sum=1;
//	while(y>0)
//	{
//		if(y%2==1)sum=sum*x%mod;
//		x=x*x%mod;
//		y/=2;
//	}
//	return sum;
//}
signed main() {
	freopen("noodle.in","r",stdin);freopen("noodle.out","w",stdout);
	int test, T;
	unsigned long long seed;
	scanf("%lld%lld%llu", &test, &T, &seed);
	for(int Case = 1; Case <= T; Case ++) {
		scanf("%lld%lld%lld%lld", &n, &q, &x, &k_max);
		for(int i = 1; i <= n; i ++) {
			scanf("%lld", &a[i]);
		}
		if(test<=2)
		{
			ans[0]=a[x];
			for(int p=1;p<=k_max;p++)
			{
				for(int j=1;j<=n;j++)b[j]=a[j];
			for(int j=1;j<=n;j++)
			if(j%2==1)a[j]=(b[(j+1)/2]+b[n-(j+1)/2+1])%mod*P%mod;
			else a[j]=a[j-1];
			ans[p]=a[x];
			for(int i=1;i<=n;i++)b[i]=a[i];
			}
			for(int i = 1; i <= q; i ++) {
			long long k = rd(seed) % k_max;
			out^=ans[k];
			}
			printf("%lld\n",out);out=0;
			for(int i=1;i<=k_max;i++)ans[i]=0;
		}
		if(test==3)
		{
			ans[0]=a[x];
			for(int p=1;(1<<p)<=n;p++)
			{
				for(int j=1;j<=n;j++)b[j]=a[j];
			for(int j=1;j<=n;j++)
			if(j%2==1)a[j]=(b[(j+1)/2]+b[n-(j+1)/2+1])%mod*p%mod;
			else a[j]=a[j-1];
			ans[p]=a[x];
			for(int i=1;i<=n;i++)b[i]=a[i];
			}
			for(int i = 1; i <= q; i ++) {
			long long k = rd(seed) % k_max;
			out^=ans[k];
			}
			printf("%lld\n",out);out=0;
			for(int i=1;(1<<i)<=n;i++)ans[i]=0;
		}
//				for(int i = 1; i <= q; i ++) {
//			long long k = rd(seed) % k_max;
//			/*
//			Code your solution here.
//			*/
//		}
	}
	return 0;
}
