#include<bits/stdc++.h>
using namespace std;
template<class T>inline void read(T &x){
	x=0;
	char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))x=x*10+(c&15),c=getchar();
}
unsigned long long rd(unsigned long long &x) {
	x ^= (x << 13);
	x ^= (x >> 7);
	x ^= (x << 17);
	return x;
}
const int P=998244353,inv2=499122177,t=22;
inline int &add(int &a,int b){
	return (a+=b)>=P?a-=P:a;
}
#define N 2000001
int n,m,q,x,a[N],b[101],ma[60][131][131],tmp[131],no[131];
long long ans;
int main(){
	freopen("noodle.in","r",stdin);
	freopen("noodle.out","w",stdout);
	int test, T;
	unsigned long long seed;
	read(test),read(T),read(seed);
	while(T--){
		long long k_max;
		read(n),read(q),read(x),read(k_max),m=n>>1,ans=0;
		for(int i=1;i<=n;i++)read(a[i]);
		b[0]=a[x];
		for(int i=1;i<=t;i++){
			for(int j=1;j<=m;j++)a[j]=((long long)a[j]+a[n-j+1])*inv2%P;
			for(int j=n;j>=1;j--)a[j]=a[(j+1)>>1];
			b[i]=a[x];
		}
		int p=n;
		while(!(p&1))p>>=1;
		for(int i=1;i<=(p+1)/2;i++)a[i]=a[(i-1)*(n/p)*2+1];
		p=(p+1)/2;
		if(p<=130){
			memset(ma,0,sizeof(ma));
			for(int i=1,l=1,r=p;i<=p;i++){
				add(ma[0][l][i],inv2),add(ma[0][r][i],inv2);
				if(i&1)--r;else --l;
			}
			for(int id=1;id<=59;id++){
				for(int i=1;i<=p;i++){
					for(int k=1;k<=p;k++){
						for(int j=1;j<=p;j++){
							add(ma[id][i][j],(long long)ma[id-1][i][k]*ma[id-1][k][j]%P);
						}
					}
				}
			}
		}
		for(int id=1;id<=q;id++){
			long long k=rd(seed)%k_max;
			if(k<=t)ans^=(long long)id*b[k];
			else if(p<=130){
				k-=t;
				for(int i=1;i<=p;i++)no[i]=a[i];
				for(int t=0;t<=59;t++){
					if((k>>t)&1){
						memset(tmp,0,sizeof(tmp));
						for(int k=1;k<=p;k++)for(int j=1;j<=p;j++)add(tmp[j],(long long)no[k]*ma[t][k][j]%P);
						memcpy(no,tmp,sizeof(tmp));
					}
				}
				ans^=(long long)id*no[(x-1)/4+1];
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
