这道题目我用一般线段树写,发现超时了,后来用结构体,就过了,于是才知道结构体速度会快好多!代码如下:#include <iostream>#include <cstdio>#include <cstring>const int maxn=50005;const int D=1000000007;__int64 a[maxn];using namespace std;struct node{ int l,r; long long sum;}root[4*maxn];void build(int u,int l,int r){ root[u].l=l; root[u].r=r; if(l==r) { root[u].sum=a[l]; return; } int mid=(l+r)>>1; build(2*u,l,mid); build(2*u+1,mid+1,r); root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;}void update(int u,int l,int r,int pos,int tre){ if(root[u].l==root[u].r&&root[u].l==pos) { root[u].sum=tre; return ; } int mid=(l+r)>>1; if(pos<=mid)update(2*u,l,mid,pos,tre); else update(2*u+1,mid+1,r,pos,tre); root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;}long long query(int u,int l,int r,int tl,int tr){ if(root[u].l>=tl&&root[u].r<=tr) { return root[u].sum; } int mid=(l+r)>>1; if(tr<=mid) query(2*u,l,mid,tl,tr); else if(tl>mid) query(2*u+1,mid+1,r,tl,tr); else { __int64 t1=query(2*u,l,mid,tl,mid); __int64 t2=query(2*u+1,mid+1,r,mid+1,tr); return (t1*t2)%D; }}int main(){ int t,n,i,p,b,c,k; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1; i<=n; i++) scanf("%I64d",&a[i]); build(1,1,n); scanf("%d",&p); for(i=0; i<p; i++) { scanf("%d%d%d",&k,&b,&c); if(k==0) { __int64 ans; ans=query(1,1,n,b,c); printf("%I64d\n",ans); } else if(k==1) { update(1,1,n,b,c); } } } return 0;}