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

来源:互联网 发布:如何在淘宝头条发文章 编辑:程序博客网 时间:2024/04/30 00:46
题意:
      给你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;}                         

0 0
原创粉丝点击