Multiply game HDU3074
#include<iostream>
#include<cstring>
#define maxn 50005
#define mod 1000000007
#define ll long long
#define qc std::ios::sync_with_stdio(false),std::cin.tie(0)
using namespace std;
struct Tree{
int l,r,mid;
ll msum;
};
Tree t[maxn<<2];
ll V[maxn];
void pushup(int k){
t[k].msum=((t[k<<1].msum)%mod*(t[k<<1|1].msum)%mod)%mod;
}
void build(int k,int l,int r){
t[k].l=l,t[k].r=r,t[k].mid=(l+r)>>1;
if(t[k].l==t[k].r){
t[k].msum=V[r]%mod;
return;
}
build(k<<1,t[k].l,t[k].mid);
build(k<<1|1,t[k].mid+1,t[k].r);
pushup(k);
}
ll query(int k,int l,int r){
// if(t[k].r<l||t[k].l>r){
// return 1;
// }
if(t[k].l>=l&&t[k].r<=r){
return t[k].msum;
}
ll ans=1;
if(l<=t[k].mid)ans*=query(k<<1,l,r)%mod;
if(r>t[k].mid)ans*=query(k<<1|1,l,r)%mod;
return ans%mod;
}
void update(int k,int index,int value){
if(t[k].r<index||t[k].l>index){
return ;
}
if(t[k].l==t[k].r){
t[k].msum=value%mod;
return;
}
if(index<=t[k].mid)update(k<<1,index,value);
else update(k<<1|1,index,value);
pushup(k);
}
int n,q,T;
int a,b,c;
int main(){
//qc;
scanf("%d",&T);
while (T--)
{
memset(t,0,sizeof(t));
memset(V,0,sizeof(V));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&V[i]);
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&a,&b,&c);
if(a){
update(1,b,c);
}
else
{
printf("%lld\n",query(1,b,c)%mod);
}
}
}
}
网友评论