1. 程式人生 > >hdu3074 線段樹求區間乘積(單點更新)

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\n" ,Query(1 ,n ,1 ,b ,c) % MOD); } } return 0; }