#include #include #include using namespace std; int flag[200005],a[200005]; int n,m; int T; long long ans1,ans2; int w[200005]; long long gcd(long long x,long long y) { if(y==0)return x; return gcd(y,x%y); } void down(int x) { if(flag[x]==0)return; flag[x*2]+=flag[x]; flag[x*2+1]+=flag[x]; flag[x]=0; } void modify(int x,int l,int r,int tx,int ty) { if(l>=tx && r<=ty) { flag[x]++; return; } down(x); int mid=(l+r)/2; if(mid>=tx)modify(x*2,l,mid,tx,ty); if(mid=wh)return query(x*2,l,mid,wh); else return query(x*2+1,mid+1,r,wh); } int main() { scanf("%d",&T); while(T--) { memset(flag,0,sizeof(flag)); memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&w[i]); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); modify(1,1,n,x,y); } ans1=0; ans2=(long long)m*(m-1)*(m-2)/6; for(int i=1;i<=n;i++) { int p=query(1,1,n,i); if(p<3)continue; long long tt=(long long)p*(p-1)*(p-2)/6; ans1+=tt*w[i]; } if(ans1==0 || ans2==0) { puts("0"); continue; } long long ttt=gcd(ans2,ans1); ans1/=ttt; ans2/=ttt; if(ans2!=1)printf("%I64d/%I64d\n",ans1,ans2);else printf("%I64d\n",ans1); } return 0; }