#include "bits/stdc++.h" #ifdef PRINTERS #include "printers.hpp" using namespace printers; #define tr(a) cerr<<#a<<" : "< #define vi vector #define vii vector #define mi map #define mii map #define all(a) (a).begin(),(a).end() #define x first #define y second #define sz(x) (int)x.size() #define hell 1000000007 #define endl '\n' #define rep(i,a,b) for(int i=a;i0; --i) t[i]=max(t[i<<1],t[i<<1|1]); } int query(int l,int r) { r++; int res=0; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l&1) res=max(res,t[l++]); if (r&1) res=max(res,t[--r]); } return res; } int sum(int l,int r) { return (r*(r+1)/2-l*(l-1)/2)%hell; } int sol1() { int ans=0; rep(i,0,n) { int L,R; { int lo=0,hi=i; while(hi-lo>1) { int mid=(lo+hi)/2; if(query(mid,i)==x[i]) hi=mid; else lo=mid; } if(query(lo,i)==x[i]) L=lo; else L=hi; } { int lo=i,hi=n-1; while(hi-lo>1) { int mid=(lo+hi)/2; if(query(i,mid)==x[i]) lo=mid; else hi=mid; } if(query(i,hi)==x[i]) R=hi; else R=lo; } int temp=sum(i,R)*(i-L+1)-sum(L,i)*(R-i+1)+(R-i+1)*(i-L+1); temp%=hell; ans=(ans+x[i]*temp)%hell; } return ans; } int cal(int l,int r,int b) { int m=min(r,b); return (sum(l,m)+(r-b)*b)%hell; } int sol2() { vi y(n); int g=max(x[0],x[1]); g=max(g,x[n-1]); rep(i,2,n-1) y[i-1]=max(g,x[i]); rep(i,0,n) t[i+n]=y[i]; build(); int ans=0; rep(i,1,n-2) { int L,R; { int lo=1,hi=i; while(hi-lo>1) { int mid=(lo+hi)/2; if(query(mid,i)==y[i]) hi=mid; else lo=mid; } if(query(lo,i)==y[i]) L=lo; else L=hi; } { int lo=i,hi=n-3; while(hi-lo>1) { int mid=(lo+hi)/2; if(query(i,mid)==y[i]) lo=mid; else hi=mid; } if(query(i,hi)==y[i]) R=hi; else R=lo; } int temp=0; rep(j,i,R+1) temp=(temp+cal(L,i,N-j+1))%hell; ans=(ans+temp*y[i])%hell; } return ans; } void solve() { cin>>n; rep(i,0,n) cin>>t[i+n],x[i]=t[i+n]; int m=n*(n+1)/2; m%=hell; int d=m*(m+1)/2; d%=hell; d=(d-(n*(n+1)*(n+1)/2)%hell+hell)%hell; d=(d+n*(n+1)*(2*n+1)/6)%hell; d=(d-((n-2)*n*(2*n-5)/24)%hell+hell)%hell; build(); int ans=(query(0,n-1)*d)%hell; ans=(ans+sol1())%hell; ans=(ans+sol2())%hell; cout<>t; while(t--) solve(); return 0; }