题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3074
又是一题线段树!!!!!
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>
using namespace std;
const int maxn=100000;
const int mod=1000000007;
struct node{
__int64 sum;
int l,r;
}f[maxn<<2];
void PushUp(int rt){
f[rt].sum = f[rt<<1].sum * f[rt<<1|1].sum;
f[rt].sum %= mod;
}
void build(int L,int R,int rt){
f[rt].l=L, f[rt].r=R;
if(L==R){
scanf("%I64d",&f[rt].sum);
return ;
}
int mid=(L+R)>>1;
build(L,mid,rt<<1);
build(mid+1,R,rt<<1|1);
PushUp(rt);
}
void update(int x,int v,int rt){
if(f[rt].r==x&&f[rt].l==x){
f[rt].sum=v;
return;
}
int mid=(f[rt].l+f[rt].r)>>1;
if(x<=mid) update(x,v,rt<<1);
else update(x,v,rt<<1|1);
PushUp(rt);
}
__int64 query(int L,int R,int rt){
if(L<=f[rt].l && R>=f[rt].r) return f[rt].sum;
int mid=(f[rt].l+f[rt].r)>>1;
__int64 ret=1;
if(L<=mid) ret*=query(L,R,rt<<1);
ret %= mod;
if(R >mid) ret*=query(L,R,rt<<1|1);
ret %= mod;
return ret;
}
int main(){
int T; scanf("%d",&T);
while(T--){
int n; scanf("%d",&n);
build(1,n,1);
int m; scanf("%d",&m);
while(m--){
int c,x,y;
scanf("%d%d%d",&c,&x,&y);
if(c==0){
if(x>y)swap(x,y);
printf("%I64d\n",query(x,y,1));
}
else update(x,y,1);
}
}
return 0;
}