#include<cstdio>
#include<cstring>
#define INF 1000000007
using namespace std;
int t,n,m,d,p[100005],T[500005];
long long tag[500005][3];
void push_down(int k)
{
tag[k<<1][0]+=tag[k][0];
tag[k<<1][1]+=tag[k][1];
tag[k<<1][2]+=tag[k][2];
tag[k<<1|1][0]+=tag[k][0];
tag[k<<1|1][1]+=tag[k][1];
tag[k<<1|1][2]+=tag[k][2];
tag[k][0]=tag[k][1]=tag[k][2]=0;
}
void update(int L,int R,int l,int r,int k,int startup,int quota)
{
if(l>=L&&r<=R)
{
tag[k][0]++;
tag[k][1]+=startup;
tag[k][2]+=quota;
}
else
{
push_down(k);
int mid=(l+r)/2;
if(L<=mid)
update(L,R,l,mid,k<<1,startup,quota);
if(R>mid)
update(L,R,mid+1,r,k<<1|1,startup,quota);
}
}
int query(int k,int target,int l,int r)
{
if(l==r)
{
int ans=(T[k]+tag[k][2]%INF+((tag[k][0]*l-tag[k][1])*d)%INF)%INF;
T[k]=tag[k][0]=tag[k][1]=tag[k][2]=0;
return ans;
}
push_down(k);
int mid=(l+r)>>1;
if(target<=mid)
return query(k<<1,target,l,mid);
return query(k<<1|1,target,mid+1,r);
}
void build(int now,int l,int r)
{
if(l==r)
T[now]=p[l];
else
{
int mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(T,0,sizeof(T));
memset(tag,0,sizeof(tag));
scanf("%d%d%d",&n,&m,&d);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
build(1,1,n);
for(int i=1,op,x,y;i<=m;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
update(x,n,1,n,1,x,y);
}
else
{
scanf("%d",&x);
printf("%d\n",query(1,x,1,n));
}
}
}
return 0;
}