#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; const int maxn=200010; int N; int maxvid,maxvsum; LL R; int height[maxn]; struct IntervalTree { LL sum[maxn<<2]; int id[maxn<<2]; void build(int o,int l,int r) { if(l==r) { sum[o]=R*(l-1)+height[l]; id[o]=l; return ; } int mid=(l+r)>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); pushup(o); } void pushup(int o) { if(sum[o<<1]maxvsum) { maxvsum=sum[o]; maxvid=id[o]; } return ; } int mid=(l+r)>>1; if(q1<=mid)query(o<<1,l,mid,q1,q2); if(q2>mid)query(o<<1|1,mid+1,r,q1,q2); } }tree; int main() { int T,cas=1; scanf("%d",&T); while(T--) { scanf("%d%I64d",&N,&R); for(int i=1;i<=N;i++) scanf("%d",&height[i]); for(int i=1;i<=N;i++) height[i+N]=height[i]; tree.build(1,1,N*2); LL anssum=0; int x,y,p; pair ans=make_pair(N,N),tmp; for(int i=1;i<=N*2;i++) { int r=i+N/2,l=i-N/2; if(r>N*2||l<1)continue; maxvid=maxvsum=0; tree.query(1,1,N*2,i+1,r); x=maxvid; maxvid=maxvsum=0; tree.query(1,1,N*2,l,i-1); y=maxvid; if((i-y)*R+height[i]+height[y]>anssum) { anssum=(i-y)*R+height[i]+height[y]; if(y>N)y-=N; p=i; if(p>N)p-=N; tmp=make_pair(min(y,p),max(y,p)); ans=tmp; } else if((i-y)*R+height[i]+height[y]==anssum) { if(y>N)y-=N; p=i; if(p>N)p-=N; tmp=make_pair(min(y,p),max(y,p)); if(tmpanssum) { anssum=(x-i)*R+height[x]+height[i]; if(x>N)x-=N; p=i; if(p>N)p-=N; tmp=make_pair(min(x,p),max(x,p)); ans=tmp; } else if((x-i)*R+height[x]+height[i]==anssum) { if(x>N)x-=N; p=i; if(p>N)p-=N; tmp=make_pair(min(x,p),max(x,p)); if(tmp