美文网首页
Multiply game (HDU3074)

Multiply game (HDU3074)

作者: miaozasnone | 来源:发表于2019-08-05 23:04 被阅读0次

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);
            }
        }
    }
}

相关文章

网友评论

      本文标题:Multiply game (HDU3074)

      本文链接:https://www.haomeiwen.com/subject/dofbdctx.html