HDU 3074 Multiply game (线段树)

来源:互联网 发布:js给div添加id 编辑:程序博客网 时间:2024/05/16 15:49

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3074


一道最基本的线段树。


AC代码:

#include <iostream>#include <vector>#include <list>#include <deque>#include <queue>#include <iterator>#include <stack>#include <map>#include <set>#include <algorithm>#include <cctype>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>using namespace std;typedef long long LL;const int N=50005;const LL II=1000000007;const int INF=0x3f3f3f3f;const double PI=acos(-1.0);int num[N];struct xh{    int l,r;    LL ans;}tree[N*3];void build(int l,int r,int k){    tree[k].l=l;    tree[k].r=r;    if(l==r)    {        tree[k].ans=num[l];        return ;    }    int m=(l+r)>>1,a=k<<1,b=k<<1|1;    build(l,m,a);    build(m+1,r,b);    tree[k].ans=(tree[a].ans*tree[b].ans)%II;}LL query(int l,int r,int k){    if(tree[k].l==l&&tree[k].r==r)    {        return tree[k].ans%II;    }    int m=(tree[k].l+tree[k].r)>>1;    if(m<l)        return query(l,r,k<<1|1);    else if(m>=r)        return query(l,r,k<<1);    else    {        return query(l,m,k<<1)*query(m+1,r,k<<1|1)%II;    }}void update(int loc,int val,int k){    if(tree[k].l==loc&&tree[k].r==loc)    {        tree[k].ans=val;        return ;    }    if(loc<=tree[k<<1].r)        update(loc,val,k<<1);    if(loc>=tree[k<<1|1].l)        update(loc,val,k<<1|1);    tree[k].ans=(tree[k<<1].ans*tree[k<<1|1].ans)%II;}int main(){    int T,i,m,n;    cin>>T;    while(T--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)            scanf("%d",&num[i]);        build(1,n,1);        scanf("%d",&m);        while(m--)        {            int o,b,c;            scanf("%d%d%d",&o,&b,&c);            if(o==0)            {                LL ans=query(b,c,1)%II;                printf("%I64d\n",ans);            }            else            {                update(b,c,1);            }        }    }    return 0;}/*161 2 4 5 6 330 2 51 3 70 2 5*/