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

来源:互联网 发布:精通 d3.js pdf 编辑:程序博客网 时间:2024/06/06 01:12

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

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

1A。

#include<stdio.h>#include<string.h>#define M 1000000007#define N 50005struct 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;}