区间求积,暴int
#include<iostream>
#include<cstdio>
#define Mod 1000000007
const int maxn = 50050;
using namespace std;
__int64 tree[maxn<<2];
void work(int rt)
{
tree[rt] =(( tree[rt<<1]%Mod) *(tree[rt<<1|1]%Mod))%Mod;
}
void build(int l, int r, int rt)
{
if(l == r)
{
scanf("%d",&tree[rt]);
return;
}
int mid = (l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
work(rt);
}
void updata(int w,int val ,int l, int r, int rt)
{
if(l == r)
{
tree[rt] = val;
return;
}
int mid = (l+r)>>1;
if(w<=mid)
updata(w,val,l,mid,rt<<1);
else
updata(w,val,mid+1,r,rt<<1|1);
work(rt);
}
__int64 query(int x, int y, int l,int r, int rt)
{
if(x<=l&&r<=y)
{
return tree[rt];
}
__int64 ans = 1;
int mid = (l+r)>>1;
if(x<=mid)
ans = (ans*query(x,y,l,mid,rt<<1))%Mod;
if(mid<y)
ans = (ans*query(x,y,mid+1,r,rt<<1|1))%Mod;
return ans;
}
int main()
{
int t,n,m,k,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&k,&a,&b);
if(k == 0)
printf("%I64d\n",query(a,b,1,n,1)%Mod);
else
updata(a,b,1,n,1);
}
}
return 0;
}