昨晚做这题的时候,思路很清晰,很快就写完了!!交上去WA了,郁闷啊!!
最后想到了int存不了啊,要用int64才行啊,改了,想交,断网了,超级不爽,怀念宽带啊!!!
这题也是线段树,求区间的乘积!很水的题!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 50010
struct node
{
int l,r;
__int64 num;//要用int64,悲剧啊!!
}tree[4*Max];
int s[Max];
__int64 ans;
void build(int l,int r,int step)
{
tree[step].l=l;
tree[step].r=r;
if(tree[step].l==tree[step].r)
{
tree[step].num=s[l];
return ;
}
int mid=(tree[step].l+tree[step].r)/2;
build(l,mid,step*2);
build(mid+1,r,step*2+1);
tree[step].num=(tree[step*2].num*tree[step*2+1].num)%1000000007;
}
void updata(int a,int b,int step)
{
if(tree[step].l==tree[step].r)
{
tree[step].num=b;
return ;
}
int mid=(tree[step].l+tree[step].r)/2;
if(a<=mid)
{
updata(a,b,step*2);
}
else
{
updata(a,b,step*2+1);
}
tree[step].num=tree[step*2].num*tree[step*2+1].num%1000000007;
}
void compute(int l,int r,int step)
{
if(tree[step].l==l&&tree[step].r==r)
{
ans=ans*tree[step].num%1000000007;
return ;
}
int mid=(tree[step].r+tree[step].l)/2;
if(r<=mid)
{
compute(l,r,step*2);
}
else
{
if(mid<l)
{
compute(l,r,step*2+1);
}
else
{
compute(l,mid,step*2);
compute(mid+1,r,step*2+1);
}
}
}
int main()
{
int n,t,i,a,b,c,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
build(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&c,&a,&b);
if(c==0)
{
ans=1;
compute(a,b,1);
printf("%I64d\n",ans);
}
else
{
updata(a,b,1);
}
}
}
return 0;
}