/*hdu3074-求區間乘積,,注意區間有0的情況*/#include <stdio.h>#include <string.h>#define MAX 50000struct TNode { int l , r; __int64 mul;}segtree[4*MAX+5];__int64 ss[MAX+1];__int64 build(int n,int l,int r){ int mid = (l+r)/2; segtree[n].mul = -1; segtree[n].l = l; segtree[n].r = r; if(l!=r) { segtree[n].mul=(build(2*n,l,mid)*build(2*n+1,mid+1,r))%1000000007; return segtree[n].mul; } else { return segtree[n].mul=ss[l]; }}void change(int n,int k,__int64 c,__int64 x=1){ int mid=(segtree[n].l+segtree[n].r)/2; if(segtree[n].l==segtree[n].r) { segtree[n].mul=c; return; } if(segtree[n].mul==-1) { segtree[n].mul=c; } else if(x==0) { ss[k]=c; segtree[n].mul=1; for(int i=segtree[n].l;i<=segtree[n].r;++i) segtree[n].mul*=ss[i]; } else { segtree[n].mul*=c; segtree[n].mul/=x; } if(k<=mid) { change(2*n,k,c); } else { change(2*n+1,k,c); } segtree[n].mul=(segtree[n*2].mul*segtree[n*2+1].mul)%1000000007;}__int64 question(int n,int l,int r){ int mid=(segtree[n].l+segtree[n].r)/2; if(segtree[n].l==l && segtree[n].r==r) { return segtree[n].mul; } if(r<=mid) { return question(2*n,l,r); } if(l>mid) { return question(2*n+1,l,r); } return (question(2*n,l,mid)*question(2*n+1,mid+1,r))%1000000007;}int main(){ int T,n,q,i,t,x1,x2,ch; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%I64d",&ss[i]); } build(1,1,n); scanf("%d",&q); while(q--) { scanf("%d%d%d",&ch,&x1,&x2); if(ch) { change(1,x1,x2,ss[x1]); ss[x1]=x2; } else { printf("%I64d\n",question(1,x1,x2)%1000000007); } } } return 0;}