#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int N=1e5+10,M=1e6+10;
const int INF=1e8;
int n,m,ID,B;
int a[N];
struct Q { int x,k,c; } q[M],b[M],qq[M];
int fa[N],f[N],g[N],col[N],pre[N],p[N],lst[N],s[N];
int Mn[N],Mx[N],it[N];
ll ans;
int limx;
uint64_t PRG_state;
uint64_t get_number()
{
PRG_state ^= PRG_state << 13;
PRG_state ^= PRG_state >> 7;
PRG_state ^= PRG_state << 17;
return PRG_state;
}
int readW(int l,int r)
{
return get_number()%(r-l+1)+l;
}
bool cmp(Q a,Q b) { return a.k<b.k; }
bool cmp2(Q a,Q b) {
if(a.x^b.x) return a.x<b.x;
return a.k<b.k;
}
ll cnt;
int siz[N],mx[N];
inline int find(int x) {
while(fa[x]!=x) cnt++,x=fa[x];
return x;
}
inline void merge(int u,int v){
u=find(u),v=find(v);
if(u==v) return ;
if(siz[u]<siz[v]) swap(u,v);
siz[u]+=siz[v];
fa[v]=u;
mx[u]=max(mx[u],mx[v]);
}
int main(){
cin>>n>>m>>ID>>PRG_state>>limx;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
q[i].x=readW(limx, n);
q[i].k=readW(1,q[i].x);
q[i].c=readW(0, 1e7);
}
B=sqrt(n)+1;
int tot=0;
for(int i=1;i<=m;i++){
if(q[i].k<=B) b[++tot]=q[i];
}
sort(b+1,b+1+tot,cmp);
for(int i=1;i<=n;i++){
int x=a[i];
p[i]=lst[x];
lst[x]=i;
}
int P=0;
for(int t=1;t<=B;t++){
for(int i=1;i<=n;i++) g[i]=f[i],fa[i]=i,col[i]=1,s[i]=0,pre[i]=i-1,siz[i]=1,mx[i]=i;
int be=1;
for(int i=1;i<=n;i++){
if(i==1){
f[i]=1; s[i]=-1;
continue;
}
int delta=g[i-1]-g[i-2]-1,now=i-1;
while(now && delta>=0){
int x=now;
col[x]=0;
if(!col[x-1]) merge(x-1,x);
if(!col[x+1]) merge(x,x+1);
delta-=s[x];
now=pre[now];
if(x==be) be=i;
}
s[i]=-delta;
pre[i]=now;
int pos=p[i]+1,R=0,L=0,jb;
if(col[pos]) L=pos;
else if((jb=mx[find(pos)])<i) L=jb+1;
if(L){
if(s[L]==1){
int x=pre[L];
s[L]=s[x];
pre[L]=pre[x];
col[x]=0;
if(!col[x-1]) merge(x-1,x);
if(!col[x+1]) merge(x,x+1);
if(x==be) be=L;
}
else s[L]--;
}
f[i]=-s[be];
}
while(P<=m && b[P+1].k<=t){
P++;
if(b[P].k==t) ans^=((ll)b[P].c*f[b[P].x]);
}
}
for(int i=1;i<=m;i++){
if(q[i].k<=B) continue;
qq[++tot]=q[i];
}
sort(qq+1,qq+1+tot,cmp2);
for(int i=1;i<=tot;i++){
if(!it[qq[i].x]) it[qq[i].x]=i;
}
for(int K=B;K>=0;K--){
for(int i=1;i<=n;i++) f[i]=-INF,fa[i]=i,col[i]=1,s[i]=0,pre[i]=i-1,Mn[i]=INF,Mx[i]=-INF,siz[i]=1,mx[i]=i;
int be=1;
for(int i=1;i<=n;i++){
if(i==1){
f[i]=1-K; s[i]=-1; Mn[1]=Mx[1]=1;
continue;
}
int delta=f[i-1]-f[i-2]-1,now=i-1;
while(now && delta>=0){
int x=now;
col[x]=0;
Mn[i-1]=min(Mn[i-1],Mn[x-1]);
Mx[i-1]=max(Mx[i-1],Mx[x-1]);
if(!col[x-1]) merge(x-1,x);
if(!col[x+1]) merge(x,x+1);
delta-=s[x];
now=pre[now];
if(x==be) be=i;
}
s[i]=-delta;
pre[i]=now;
int pos=p[i]+1,R=0,L=0,jb;
if(col[pos]) L=pos;
else if((jb=mx[find(pos)])<i) L=jb+1;
if(L){
if(s[L]==1){
int x=pre[L];
Mn[L-1]=min(Mn[L-1],Mn[x-1]);
Mx[L-1]=max(Mx[L-1],Mx[x-1]);
s[L]=s[x];
pre[L]=pre[x];
col[x]=0;
if(!col[x-1]) merge(x-1,x);
if(!col[x+1]) merge(x,x+1);
if(x==be) be=L;
}
else s[L]--;
}
f[i]=-s[be]-K;
Mn[i]=Mn[be-1]; Mx[i]=Mx[be-1];
Mn[i]++; Mx[i]++;
}
for(int i=1;i<=n;i++){
for(int j=it[i];;j++){
Q u=qq[j];
if(u.x!=i){
it[i]=j;
break;
}
if(Mn[i]<=u.k && u.k<=Mx[i]){
ans^=(ll)u.c*(f[i]+u.k*K);
}
else {
it[i]=j;
break;
}
}
}
}
cerr<<cnt<<endl;
cerr<<clock()*1.0/CLOCKS_PER_SEC<<endl;
printf("%lld\n",ans);
return 0;
}