版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40924940/article/details/84945413
本题还是很简单的。。线段树模板。。重新复习了一下。。区间修改和乘法运算。。。注意取模就好。。
顺便更新下模板。。。
以下是 AC 代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long int
#define L(rt) (rt<<1)
#define R(rt) (rt<<1|1)
const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;
int ans[maxn];
struct tree
{
int l,r;
ll num;
}sd[maxn];
void build(int l,int r,int rt)
{
sd[rt].l = l;
sd[rt].r = r;
if(l == r)
{
sd[rt].num = ans[l];
return;
}
int mid = (l+r)>>1;
build(l,mid,L(rt));
build(mid+1,r,R(rt));
sd[rt].num = sd[L(rt)].num * sd[R(rt)].num % mod;
}
ll query(int l,int r,int rt)
{
if(sd[rt].l==l && sd[rt].r==r)
return sd[rt].num;
int mid=(sd[rt].l + sd[rt].r)>>1;
if(r <= mid)
{
return query(l,r,L(rt));
}
else if(l >= mid+1)
{
return query(l,r,R(rt));
}
else
{
ll a=query(l,mid,L(rt));
ll b=query(mid+1,r,R(rt));
return (a*b)%mod;
}
}
void update(int id,int val,int rt)
{
if(sd[rt].l == id && sd[rt].r == id)
{
sd[rt].num = val;
return ;
}
if(id<=sd[L(rt)].r)
update(id,val,L(rt));
if(id>=sd[R(rt)].l)
update(id,val,R(rt));
sd[rt].num = (sd[L(rt)].num * sd[R(rt)].num) % mod;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&ans[i]);
build(1,n,1);
scanf("%d",&m);
int ch,x,y;
while(m--)
{
scanf("%d%d%d",&ch,&x,&y);
if(ch == 0)
{
ll ant = query(x,y,1);
printf("%d\n",ant % mod);
}
else
{
update(x,y,1);
}
}
}
return 0;
}