0 k1 k2; you need to work out the multiplication of the subsequence
from k1 to k2, inclusive.
1 k p; the kth number of the sequence has been change to p.
(1<=k<=n)
思路:线段树 跟前面做的几道对比 有点简单了 但要注意要用__int64 而且每乘完后都要取模
//484MS
2452K
#include <stdio.h>
#define M 50050
#define L(x) (x<<1)
#define R(x) ((x<<1)+1)
#define inf 1000000007
int num[M];
struct data
{
l,r;
ans;
}node[M*3];
void BuildTree(int left,int right,int u)
{
left;
right;
right)
node[u].ans = num[left];
return ;
(left + right)>>1;
BuildTree(left,mid,L(u));
BuildTree(mid+1,right,R(u));
= (node[L(u)].ans * node[R(u)].ans)%inf;
}
__int64 query (int left,int right,int u)
{
(node[u].l == left&&node[u].r ==
right)
return node[u].ans;
(node[u].l + node[u].r)>>1;
<= mid)
return query (left,right,L(u));
>= mid+1)
return query (left,right,R(u));
query (left,mid,L(u));
query (mid+1,right,R(u));
(a*b)%inf;
//这里没取模 WA了无数次啊!!
}
void updata (int loc,int num,int u)
{
(node[u].l == loc&&node[u].r ==
loc)
node[u].ans = num;
return ;
<= node[L(u)].r)
updata (loc,num,L(u));
>= node[R(u)].l)
updata (loc,num,R(u));
= (node[L(u)].ans * node[R(u)].ans)%inf;
}
int main ()
{
t,n,m,i,op,x,y;
("%d",&t);
--)
scanf ("%d",&n);
for (i = 1;i <= n;i ++)
scanf ("%d",&num[i]);
BuildTree(1,n,1);
scanf ("%d",&m);
while (m --)
{
scanf
("%d%d%d",&op,&x,&y);
if (op == 0)
{