hdu3074 线段树求区间乘积(单点更新)

题意:
      给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余。

思路:

      线段树单点更新,简单题目,不多解释,具体看代码。



#include<stdio.h>

#define lson l ,mid ,t << 1
#define rson mid + 1 ,r ,t << 1 | 1
#define MOD 1000000007

__int64 sum[50000*4+100];

void Pushup(int t)
{
    sum[t] = ((sum[t<<1] % MOD) * (sum[t<<1|1] % MOD)) % MOD;
}

void BuidTree(int l ,int r ,int t)
{
    sum[t] = 1;
    if(l == r)
    {
        scanf("%I64d" ,&sum[t]);
        sum[t] %= MOD;
        return;
    }
    int mid = (l + r) >> 1;
    BuidTree(lson);
    BuidTree(rson);
    Pushup(t);
}

void Update(int l ,int r ,int t ,int a ,int b)
{
     if(l == r)
     {
          sum[t] = b % MOD;
          return;
     }
     int mid = (l + r) >> 1;
     if(a <= mid) Update(lson ,a ,b);
     else Update(rson ,a ,b);
     Pushup(t);
}

__int64 Query(int l ,int r ,int t ,int a ,int b)
{
    if(a <= l && b >= r)
    return sum[t];
    int mid = (l + r) >> 1;
    __int64 ans = 1;
    if(a <= mid) ans = Query(lson ,a ,b) % MOD;
    if(b > mid) ans *= Query(rson ,a ,b) % MOD;
    return ans % MOD;
}

int main ()
{
    int t ,i ,n ,m ,a ,b ,c;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d" ,&n);
        BuidTree(1 ,n ,1);
        scanf("%d" ,&m);
        while(m--)
        {
           scanf("%d %d %d" ,&a ,&b ,&c);
           if(a) Update(1 ,n ,1 ,b ,c);
           else printf("%I64d
" ,Query(1 ,n ,1 ,b ,c) % MOD);
        }
    }
    return 0;
}
                  
    
   





原文地址:https://www.cnblogs.com/csnd/p/12062827.html