#include <bits/stdc++.h>
#define mod 998244353
using namespace std;

unsigned long long rd(unsigned long long &x) {
	x ^= (x << 13);
	x ^= (x >> 7);
	x ^= (x << 17);
	return x;
}
int n, q, x;
int test, T;
unsigned long long seed;
long long k_max;
namespace subtask3
{
	struct matrix
	{
		int n;
		long long a[155][155];
	};
	matrix p[85];
	matrix operator *(matrix x,matrix y)
	{
		matrix ans;
		ans.n=x.n;
		for (int i=1;i<=ans.n;i++) for (int j=1;j<=ans.n;j++) ans.a[i][j]=0;
		for (int k=1;k<=ans.n;k++)
			for (int i=1;i<=ans.n;i++)
				for (int j=1;j<=ans.n;j++)
					ans.a[i][j]=(ans.a[i][j]+1ll*x.a[i][k]*y.a[k][j])%mod;
		return ans;
	}
	int getans(long long k,std::vector<int> a,int pos)
	{
		std::vector<int> ans=a;
//		printf("k = %lld\n",k);
//		for (int i=1;i<=n;i++) printf("%d ",a[i]);puts("");
		for (int i=0;i<=60;i++)
			if ((1ll<<i)&k)
			{
				for (int x=1;x<=n;x++) ans[x]=0;
				for (int x=1;x<=n;x++) for (int y=1;y<=n;y++) ans[y]=(ans[y]+a[x]*p[i].a[x][y])%mod;
				a=ans;
			}
//		for (int i=1;i<=n;i++) printf("%d ",ans[i]);puts("");
		return ans[pos];
	}
	void solve(std::vector<int> now)
	{
		std::vector<int> a=now;
		long long res=0;
		long long f[n+5][n+5];
		for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f[i][j]=0;
		for (int x=1;x<=n/2;x++) f[x*2-1][x]=f[x*2][x]=f[x*2-1][n-x+1]=f[x*2][n-x+1]=499122177ll%mod;
		p[0].n=n;
		for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) p[0].a[j][i]=f[i][j];
		for (int i=1;i<=75;i++) p[i]=p[i-1]*p[i-1];
//		for (int i=1;i<=n;i++)
//		{
//			for (int j=1;j<=n;j++) printf("%d ",p[1].a[i][j]);
//			puts("");
//		}
		for(int i = 1; i <= q; i ++) {
			long long k = rd(seed) % k_max;
//			printf("%lld\n",k);
			long long ret=getans(k,a,x);
//			printf("Ret %lld\n",ret);
			res=res^(ret*i);
		}
		printf("%lld\n",res);
	}
}
int main() {
	scanf("%d%d%llu", &test, &T, &seed);
	for(int Case = 1; Case <= T; Case ++) {
		scanf("%d%d%d%lld", &n, &q, &x, &k_max);
		vector<int> a(n + 1);
		for(int i = 1; i <= n; i ++) {
			scanf("%d", &a[i]);
		}
		if (test==2||test==3)
		{
			long long ans[105],res=0;
			vector<int> f(n+1);
			ans[0]=a[x];
			for (int i=1;i<=40;i++)
			{
				for (int x=1;x<=n/2;x++) f[x*2-1]=f[x*2]=(a[x]+a[n-x+1])*499122177ll%mod;
				for (int x=1;x<=n;x++) a[x]=f[x];
				ans[i]=a[x];
			}
			for(int i = 1; i <= q; i ++) {
				long long k = rd(seed) % k_max;
//				printf("k = %lld\n",k);
				if (k>40) k=40;
				res=res^(ans[k]*i);
			}
			printf("%lld\n",res);
			continue;
		}
		if (test==1)
		{
			long long ans[505],res=0;
			vector<int> f(n+1);
			ans[0]=a[x];
			for (int i=1;i<=k_max;i++)
			{
				for (int x=1;x<=n/2;x++) f[x*2-1]=f[x*2]=(a[x]+a[n-x+1])*499122177ll%mod;
				for (int x=1;x<=n;x++) a[x]=f[x];
				ans[i]=a[x];
			}
			for(int i = 1; i <= q; i ++) {
				long long k = rd(seed) % k_max;
				res=res^(ans[k]*i);
			}
			printf("%lld\n",res);
			continue;
		}
		if (4<=test&&test<=6) subtask3::solve(a);
	}
	return 0;
}
