#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
namespace func{
	typedef long long ll;
	constexpr int mod=998244353;
	void modp(int&x){
		x>=mod&&(x-=mod);
	}
	void modpdiv2(int&x){
		if((x&1))
			x>=mod?(x=(x-mod)>>1):(x=(x+mod)>>1);
		else
			x>>=1;
	}
	void modn(int&x){
		x<0&&(x+=mod);
	}
	ll quickpow(ll x,int k,ll ret=1){
		for(; k; k>>=1,x=x*x%mod)
			(k&1)&&(ret=ret*x%mod);
		return ret;
	}
	template<typename T>void readuint(T&x){
		char ch;
		while((ch=getchar())<'0');
		for(x=ch^'0'; (ch=getchar())>='0'; x=x*10+(ch^'0'));
	}
	void writeuint(int x){
		char str[10];
		char*const ed=str+9;
		char*now=ed;
		for(; x>=10; x/=10,--now)
			*now=(x%10)|'0';
		*now=x|'0';
		for(; now<=ed; ++now)
			putchar(*now);
	}
	template<typename T>void writelnuint(const T&x){
		writeuint(x);
		putchar('\n');
	}
	int popcnt(const int&x){
		return __builtin_popcount(x);
	}
}
namespace program{
	using namespace func;
	typedef long long ll;
	typedef unsigned long long ull;
	constexpr int max_n=2000000;
	ull rd(ull &x) {
		x ^= (x << 13);
		x ^= (x >> 7);
		x ^= (x << 17);
		return x;
	}
	int a[max_n*2],st[max_n+1],b[max_n+1],c[max_n+1];
	bool vis[max_n+1];
	int cyc[max_n+2],sym[max_n+2];
	void test(ull&sd){
		int n,q,x;
		ll k_max;
		scanf("%d%d%d%lld",&n,&q,&x,&k_max);
		for(int i=1; i<=n; ++i)
			readuint(a[i]);
//		for(int i=1; i<=n; ++i)
//			printf("%d ",a[i]);
//		puts("");
		int cnt=0;
		st[0]=0;
		for(int now=n; !(n&1); now+=n){
			n/=2;
			st[++cnt]=now;
			int*const prv=a+st[cnt-1],*const nowa=a+st[cnt];
			for(int i=1; i<=n; ++i)
				modpdiv2(nowa[i]=prv[i]+nowa[1-i]);
//			for(int i=1; i<=n; ++i)
//				printf("%d ",nowa[i]);
//			puts("");
		}
		b[n]=(a+st[cnt])[(n+1)>>1];
		for(int i=n-1,*const l=a+st[cnt],*const r=a+st[cnt]+n+1; i; i-=2){
			modpdiv2(b[i-1]=l[i/2]+r[-i/2]);
			b[i]=b[i-1];
		}
		const int p=((x-1)>>cnt)+1;
//		printf("%d %d\n",cnt,p);
//		for(int i=1; i<=n; ++i)
//			printf("%d ",b[i]);
//		puts("");
		ll otp=0;
		if(n==1)
			for(int i=1; i<=q; ++i){
				ll k=rd(sd)%k_max;
				if(k<=cnt){
					otp^=ll(a[st[k]+((x-1)>>k)+1])*i;
					continue;
				}
				k-=cnt+1;
				otp^=ll(b[1])*i;
			}
		else{
			for(int i=2; i<n; i+=2)
				c[i/2]=b[i+1]-b[i];
			const int hf=n>>1;
			ll sm=0;
			for(int i=1; i<=n; ++i)
				sm+=b[i];
			for(int i=1; i<=q; ++i){
				ll k=rd(sd)%k_max;
				if(k<=cnt){
					otp^=ll(a[st[k]+((x-1)>>k)+1])*i;
					continue;
				}
				k-=cnt+1;
				int sum=0;
				for(int i=1; i<=hf; ++i){
					if(!vis[i]){
						int len=1;
						vis[i]=1,cyc[1]=i,sym[1]=1;
						int now=i,flg=1;
						do{
							if(now<=hf/2)
								now*=2;
							else
								now=(hf-now)<<1|1,flg*=-1;
							vis[now]=1;
							++len;
							cyc[len]=now,sym[len]=-1;
						}while(now!=i);
						--len;
						int k1=k%(len<<1);
//						printf("%d %d\n",cyc[len+1],sym[len+1]);
						for(int i=k1,ed=k1+len; i<ed; ++i){
							const int origpos=cyc[(i-k1)%len+1];
							const int nowpos=cyc[i%len+1];
							const int s=sym[(i-k1)%len+1]*((i/len%2)?sym[len+1]*sym[i%len+1]:sym[i%len+1]);
//							printf("%d: %d %d\n",origpos,nowpos,s);
							sum=(sum+c[origpos]*ll(mod+s)%mod*ll(nowpos*2<p?-nowpos*2:(n-nowpos*2)))%mod;
						}
					}
				}
				for(int i=1; i<=hf; ++i)
					vis[i]=0;
				sum=quickpow(2,mod-1-k,sum);
				ll ans=quickpow(n,mod-2,sm-sum);
//				fprintf(stderr,"%d: %lld\n",k+cnt+1,ans);
				otp^=ans*i;
			}
		}
		printf("%lld\n",otp);
	}
	void main(){
		int t;
		ull sd;
		for(scanf("%*d%d%llu",&t,&sd); t; test(sd),--t);
	}
}
int main(){
	freopen("noodle.in","r",stdin);
	freopen("noodle.out","w",stdout);
	program::main();
	return 0;
}
