题目链接: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; }