hdu 3074 Multiply game(模板级线段树)

离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树。

纯模板,就是把单点更新,区间求和改为单点更新,区间求积。

1A。

 

#include<stdio.h>
#include<string.h>
#define M 1000000007
#define N 50005
struct node
{
    int x,y;
    __int64 sum;
}a[N*3];
void CreatTree(int t,int x,int y)
{
    a[t].x=x;
    a[t].y=y;
    a[t].sum=0;
    if(x==y)
        return ;
    int temp=t*2;
    int mid=(x+y)/2;
    CreatTree(temp,x,mid);
    CreatTree(temp+1,mid+1,y);
    return ;
}
void InsertTree(int t,int x,int k)
{
    if(a[t].x==a[t].y)
    {
        a[t].sum=k;
        return ;
    }
    int temp=t*2;
    int mid=(a[t].x+a[t].y)/2;
    if(x<=mid)
        InsertTree(temp,x,k);
    else
        InsertTree(temp+1,x,k);
    a[t].sum=a[temp].sum*a[temp+1].sum%M;
    return ;
}
__int64 FindTree(int t,int x,int y)
{
    __int64 sum=1;
    if(a[t].x==x&&a[t].y==y)
        return a[t].sum;
    int temp=t*2;
    int mid=(a[t].x+a[t].y)/2;
    if(y<=mid)
        sum*=FindTree(temp,x,y);
    else if(x>mid)
        sum*=FindTree(temp+1,x,y);
    else
    {
        sum=FindTree(temp,x,mid)*sum%M;
        sum=FindTree(temp+1,mid+1,y)*sum%M;
    }
    return sum;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        CreatTree(1,1,n);
        int i;
        for(i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            InsertTree(1,i,x);
        }
        int m;
        scanf("%d",&m);
        while(m--)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            if(x==0)
                printf("%I64d\n",FindTree(1,y,z));
            else
                InsertTree(1,y,z);
        }
    }
    return 0;
}


 

 

posted @ 2013-07-19 19:41  坚固66  阅读(149)  评论(0编辑  收藏  举报