#include<bits/stdc++.h> #define FILE "read" #define MAXN 200100 using namespace std; const int mod=1e9+7; int n,m,cnt,fac[MAXN],inv[MAXN],root[MAXN<<4],sum[MAXN<<4],son[MAXN<<4][2]; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } inline int add(int a,int b){return (a+=b)>=mod?a-mod:a;} inline int sub(int a,int b){return (a-=b)<0?a+mod:a;} inline int mul(int a,int b){return 1LL*a*b%mod;} inline int pow(int a,int b){ int ret=1; while(b){ if(b&1) ret=mul(ret,a); a=mul(a,a); b>>=1; } return ret; } void pre(){ int N=100000; fac[0]=1; for(int i=1;i<=N;++i) fac[i]=mul(fac[i-1],i); inv[N]=pow(fac[N],mod-2); for(int i=N-1;i>=0;--i) inv[i]=mul(inv[i+1],i+1); } int newnode(int last){ ++cnt; son[cnt][0]=son[last][0]; son[cnt][1]=son[last][1]; sum[cnt]=sum[last]+1; return cnt; } void build(int &root,int last,int l,int r,int v){ root=newnode(last); if(l==r) return; int mid=(l+r)>>1; if(v<=mid) build(son[root][0],son[last][0],l,mid,v); else build(son[root][1],son[last][1],mid+1,r,v); } int find(int rootL,int rootR,int l,int r,int k){ if(l==r) return l; int mid=(l+r)>>1,temp=sum[son[rootR][0]]-sum[son[rootL][0]]; if(k<=temp) return find(son[rootL][0],son[rootR][0],l,mid,k); else return find(son[rootL][1],son[rootR][1],mid+1,r,k-temp); } int calc(int rootL,int rootR,int l,int r,int v){ if(l==r) return sum[rootR]-sum[rootL]; int mid=(l+r)>>1; if(v<=mid) return calc(son[rootL][0],son[rootR][0],l,mid,v); else return sum[son[rootR][0]]-sum[son[rootL][0]]+calc(son[rootL][1],son[rootR][1],mid+1,r,v); } void clear(){ cnt=0; memset(sum,0,sizeof(sum)); memset(son,0,sizeof(son)); memset(root,0,sizeof(root)); } void solve(){ n=read(); m=read(); clear(); for(int i=1;i<=n;++i) build(root[i],root[i-1],1,n,read()); for(int i=1;i<=m;++i){ int l1=read(),r1=read(),l2=read(),r2=read(),S=r1-l1+1,ans=1; for(int k=1,last=0;k<=S;k=last+1){ int I=find(root[l2-1],root[r2],1,n,k); int x=calc(root[l1-1],root[r1],1,n,I); int J=find(root[l1-1],root[r1],1,n,x+1); last =calc(root[l2-1],root[r2],1,n,J); ans=mul(ans,mul(fac[x-k+1],inv[x-last])); } printf("%d\n",ans); } } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); pre(); for(int T=read();T;--T) solve(); return 0; }
|