/*
hdu3074-求区间乘积,,注意区间有0的情况
*/
#include <stdio.h>
#include <string.h>
#define MAX 50000
struct TNode {
int l , r;
__int64 mul;
}segtree[4*MAX+5];
__int64 ss[MAX+1];
__int64 build(int n,int l,int r)
{
int mid = (l+r)/2;
segtree[n].mul = -1;
segtree[n].l = l;
segtree[n].r = r;
if(l!=r)
{
segtree[n].mul=(build(2*n,l,mid)*build(2*n+1,mid+1,r))%1000000007;
return segtree[n].mul;
}
else
{
return segtree[n].mul=ss[l];
}
}
void change(int n,int k,__int64 c,__int64 x=1)
{
int mid=(segtree[n].l+segtree[n].r)/2;
if(segtree[n].l==segtree[n].r)
{
segtree[n].mul=c;
return;
}
if(segtree[n].mul==-1)
{
segtree[n].mul=c;
}
else if(x==0)
{
ss[k]=c;
segtree[n].mul=1;
for(int i=segtree[n].l;i<=segtree[n].r;++i)
segtree[n].mul*=ss[i];
}
else
{
segtree[n].mul*=c;
segtree[n].mul/=x;
}
if(k<=mid)
{
change(2*n,k,c);
}
else
{
change(2*n+1,k,c);
}
segtree[n].mul=(segtree[n*2].mul*segtree[n*2+1].mul)%1000000007;
}
__int64 question(int n,int l,int r)
{
int mid=(segtree[n].l+segtree[n].r)/2;
if(segtree[n].l==l && segtree[n].r==r)
{
return segtree[n].mul;
}
if(r<=mid)
{
return question(2*n,l,r);
}
if(l>mid)
{
return question(2*n+1,l,r);
}
return (question(2*n,l,mid)*question(2*n+1,mid+1,r))%1000000007;
}
int main()
{
int T,n,q,i,t,x1,x2,ch;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%I64d",&ss[i]);
}
build(1,1,n);
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d",&ch,&x1,&x2);
if(ch)
{
change(1,x1,x2,ss[x1]);
ss[x1]=x2;
}
else
{
printf("%I64d\n",question(1,x1,x2)%1000000007);
}
}
}
return 0;
}
hdu3074-线段树(求区间乘积)
最新推荐文章于 2022-04-14 11:18:10 发布