时间: 2020-11-23|55次围观|0 条评论

/* *********************************************** Author :xryz Email :523689985@qq.com Created Time :4-30 21:25:25 File Name :Multiply game.cpp ************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

const int  mod=1000000007;
struct node
{
    int left,right;
    long long int sum;
} t[200000+5];
int a[50000+24];

void make(int id,int l,int r)//建树
{
    t[id].left=l;
    t[id].right=r;
    if(l==r)
    {
        t[id].sum=a[l];
    }
    else
    {
        int mid=(l+r)/2;
        make(id*2,l,mid);
        make(id*2+1,mid+1,r);
        t[id].sum=(t[id*2].sum*t[id*2+1].sum%mod);
    }
}


void mult(int id,int pos,int p)//单点更新
{
    int mid=(t[id].left+t[id].right)/2;
    if(t[id].left==t[id].right&&t[id].left==pos)
    {
        t[id].sum=p;
        return ;
    }
    else if(pos>mid) mult(id*2+1,pos,p);
    else mult(id*2,pos,p);
    t[id].sum=(t[id*2].sum*t[id*2+1].sum)%mod;
    //if(t[id].sum==0) printf("%d\n",id);
}

long long int query(int l,int r,int id)//查询
{
    if(t[id].left==l&&t[id].right==r)
        return t[id].sum;
    else
    {
        int mid=(t[id].left+t[id].right)/2;
        if(r<=mid) return query(l,r,id*2);
        else if(l>mid) return query(l,r,id*2+1);
        else
            return (query(l,mid,id*2)*query(mid+1,r,id*2+1))%mod;

    }
}

int main()
{
    int T,cmd,i,n,k,t1,t2;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        a[0]=1;
        for(i=1; i<=n; i++) scanf("%d",&a[i]);
        make(1,1,n);
        scanf("%d",&k);
        while(k--)
        {
            scanf("%d%d%d",&cmd,&t1,&t2);
            if(cmd==1)
            {
                mult(1,t1,t2);
                a[t1]=t2;
                //int ans=query(2,5,1);printf("%d\n",ans);
            }
            else
            {
                int ans=query(t1,t2,1)%mod;
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

转载于:https://www.cnblogs.com/xryz/p/4848022.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/95009025

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《hdu 3074 Multiply game
   

还没有人抢沙发呢~