#include <bits/stdc++.h>
using namespace std;
const long long md=998244353;

struct node{
	long long k;
	int id;
}qq[2000010];

inline long long qsm(long long a,long long b)
{
	long long ret=1;
	for (;b;b>>=1)
	{
		if (b&1) ret=ret*a%md;
		a=a*a%md;
	}
	return ret;
}

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

bool cmp(node a,node b)
{
	return a.k<b.k;
}

int main() {
	freopen("noodle.in","r",stdin);
	freopen("noodle.out","w",stdout);
//	cout<<"$%^&*("<<endl;
	int test, T;
	unsigned long long seed;
	scanf("%d%d%llu", &test, &T, &seed);
	long long ss=qsm(2,md-2);
//	cout<<ss<<endl;
	if (test==1)
	{
		for(int Case = 1; Case <= T; Case ++) {
			long long ret=0;
			int n, q, x;
			long long k_max;
			scanf("%d%d%d%lld", &n, &q, &x, &k_max);
			vector<long long> a(n + 5),b(n+5),c(n+5);
			for(int i = 1; i <= n; i ++) {
				scanf("%lld", &a[i]);
			}
			for(int i = 1; i <= q; i ++) {
				long long k = rd(seed) % k_max;
				for (int j=1;j<=n;j++)
					c[j]=a[j];
				for (int j=1;j<=k;j++)
				{
					for (int kk=1;kk<=n/2;kk++)
					{
						b[kk]=(c[kk]+c[n-kk+1])%md;
					}
					for (int kk=1;kk<=n;kk++)
					{
						c[kk]=b[(kk+1)/2]*ss%md;
					}
				}
				ret^=(c[x]*i%md);
			}
			printf("%lld\n",ret);
		}
	}
	else if (test==2||test==3)
	{
		for(int Case = 1; Case <= T; Case ++) {
			long long ret=0;
			int n, q, x;
			long long k_max;
			scanf("%d%d%d%lld", &n, &q, &x, &k_max);
			vector<long long> a(n + 5),b(n+5),c[26];
			c[0].reserve(n+5);
			for(int i = 1; i <= n; i ++) {
				scanf("%lld", &a[i]);
//				cout<<a[i]<<endl;
				c[0][i]=a[i];
			}
			for (int i=1;i<=25;i++)
			{
				c[i].reserve(n+5);
				for (int j=1;j<=n/2;j++)
				{
					b[j]=(c[i-1][j]+c[i-1][n-j+1])%md;
				}
				for (int j=1;j<=n;j++)
				{
					c[i][j]=b[(j+1)/2]*ss%md;
				}
			}
			for(long long i = 1; i <= q; i ++) {
				long long k = rd(seed) % k_max;
				ret^=(c[min(k,25ll)][x]*i%md);
			}
			printf("%lld\n",ret);
		}
	}
//	else if (test==7)
//	{
//		long long p[500000000];
//		p[0]=1;
//		for (int i=1;i<=499122175;i++)
//			p[i]=p[i-1]*2%md;
//		long long nee=qsm(p[25],md-2);
//		for(int Case = 1; Case <= T; Case ++) {
//			int n, q, x;
//			long long k_max;
//			scanf("%d%d%d%lld", &n, &q, &x, &k_max);
//			long long nnn=qsm(n,md-2);
//			long long a[2000010],b[2000010],c[30][2000010],sum=0;
//			for(int i = 1; i <= n; i ++) {
//				scanf("%lld", &a[i]);
//				c[0][i]=a[i];
//				sum+=a[i];
//			}
//			for (int i=1;i<=25;i++)
//			{
//				for (int j=1;j<=n/2;j++)
//				{
//					b[j]=(c[i-1][j]+c[i-1][n-j+1])%md;
//				}
//				for (int j=1;j<=n;j++)
//				{
//					c[i][j]=b[(j+1)/2]%md;
//				}
//			}
//			long long delta=c[25][1]-c[25][n];
//			long long ret=0;
//			for(long long i = 1; i <= q; i ++) {
//				long long k = rd(seed) % k_max;
//				if (k<=25)
//				{
//					ret^=(c[k][x]*qsm(p[k],md-2)%md*i%md);
//				}
//				else
//				{
//					k-=25;
//					long long s1,s2,ss;
//					if (k%2==0) ss=nee*qsm(p[k%499122176],md-2)%md*delta%md;
//					else ss=nee*qsm(p[k%499122176],md-2)%md*delta%md*(-1);
//					if (x<=65536) ret^=((sum+ss*32768)%md*nnn%md*i%md);
//					else ret^=((sum-ss*65536%md+md)%md*nnn%md*i%md);
//				}
//			}
//			printf("%lld\n",ret);
//		}
//	}
	return 0;
}
