题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3074
普通线段树 节点保存 区间的乘积%1000000007
#include <iostream>
#include <cstdio>
#define mod 1000000007
using namespace std;
const int maxn = 50010;
typedef long long LL;
struct tree
{
int l,r;
long long p;
}nod[maxn<<2];
int num[maxn];
void build(int t,int l,int r)
{
nod[t].l=l;
nod[t].r=r;
if(l==r)
{
nod[t].p=num[l];
return ;
}
int mid=(l+r)>>1;
build(t<<1,l,mid);
build(t<<1|1,mid+1,r);
nod[t].p=(nod[t<<1].p*nod[t<<1|1].p)%mod;
}
void update(int t,int n,int x)
{
if(nod[t].l==n && nod[t].r==n){
nod[t].p=x;
return ;
}
if(n<=nod[t<<1].r)
update(t<<1,n,x);
if(n>=nod[t<<1|1].l)
update(t<<1|1,n,x);
nod[t].p=(nod[t<<1].p*nod[t<<1|1].p)%mod;
}
long long query(int rt,int l,int r)
{
if(nod[rt].l==l && nod[rt].r==r)
return nod[rt].p;
int mid=(nod[rt].l+nod[rt].r)>>1;
if(r<=mid)
return query(rt<<1,l,r);
else if(l>=mid+1)
return query(rt<<1|1,l,r);
else{
long long a=query(rt<<1,l,mid);
long long b=query(rt<<1|1,mid+1,r);
return (a*b)%mod;
}
}
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
//printf("***\n");
scanf("%d",&m);
//printf("****\n");
build(1,1,n);
// printf("***\n");
int a,b,c;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(a==1)
update(1,b,c);
else
printf("%lld\n",query(1,b,c));
}
}
return 0;
}