#include<iostream>
#include<stack>
#define int long long
using namespace std;
const int N=2e6+5;
int n,m,type,sum[N],L[N],R[N],dp1[N],dp2[N],sum1[N],sum2[N],mini[N][30],pos[N][30],lg[N];
namespace gen{
typedef unsigned long long ull;
ull s,a,b,c,lastans=0;
ull rand(){
return s^=(a+b*lastans)%c;
}
};
stack<int>stk;
void init_stack()
{
for(int i=1;i<=n;i++)
{
while(!stk.empty()&&sum[i]<sum[stk.top()])
{
R[stk.top()]=i;
stk.pop();
}
stk.push(i);
}
while(!stk.empty())
{
R[stk.top()]=n+1;
stk.pop();
}
for(int i=n;i>=1;i--)
{
while(stk.empty()==false&&sum[i]<sum[stk.top()])
{
L[stk.top()]=i;
stk.pop();
}
stk.push(i);
}
while(!stk.empty())
{
L[stk.top()]=0;
stk.pop();
}
}
void init_dp()
{
for(int i=1;i<=n;i++)
{
dp1[i]=dp1[L[i]]+sum[i]*(i-L[i]);
sum1[i]=sum1[i-1]+dp1[i];
}
for(int i=n;i>=1;i--)
{
dp2[i]=dp2[R[i]]+sum[i]*(R[i]-i);
sum2[i]=sum2[i+1]+dp2[i];
}
return;
}
void init_rmq()
{
for(int i=1;i<=n;i++)
{
mini[i][0]=sum[i],pos[i][0]=i;
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
if(mini[i][j-1]<=mini[i+(1<<j-1)][j-1])
mini[i][j]=mini[i][j-1],pos[i][j]=pos[i][j-1];
else
mini[i][j]=mini[i+(1<<j-1)][j-1],pos[i][j]=pos[i+(1<<j-1)][j-1];
}
}
return;
}
signed main()
{
cin>>n>>m>>type;
lg[0]=-1;
for(int i=1;i<=n;i++)
{
lg[i]=lg[i/2]+1;
}
for(int i=1;i<=n;i++)
{
cin>>sum[i];
}
init_stack();init_dp();init_rmq();
unsigned long long tmp,ans=0;int x,y;
if(type==0)
{
for(int i=1;i<=m;i++)
{
cin>>x>>y;
int posA=0,len=y-x+1;
if(mini[x][lg[len]]<=mini[y-(1<<lg[len])+1][lg[len]])posA=pos[x][lg[len]];
else posA=pos[y-(1<<lg[len])+1][lg[len]];
tmp=sum[posA]*(posA-x+1)*(y-posA+1);
tmp+=sum2[x]-sum2[posA]-dp2[posA]*(posA-x);
tmp+=sum1[y]-sum1[posA]-dp1[posA]*(y-posA);
ans^=tmp;
}
}
if(type==1)
{
cin>>gen::s>>gen::a>>gen::b>>gen::c;
for(int i=1;i<=m;i++)
{
x=gen::rand()%n+1;y=gen::rand()%n+1;
if(x>y)swap(x,y);
int posA=0,len=y-x+1;
if(mini[x][lg[len]]<=mini[y-(1<<lg[len])+1][lg[len]])posA=pos[x][lg[len]];
else posA=pos[y-(1<<lg[len])+1][lg[len]];
tmp=sum[posA]*(posA-x+1)*(y-posA+1);
tmp+=sum2[x]-sum2[posA]-dp2[posA]*(posA-x);
tmp+=sum1[y]-sum1[posA]-dp1[posA]*(y-posA);
ans^=tmp;gen::lastans=tmp;
}
}
cout<<ans;
return 0;
}