线段数_HDU_3074

来源:互联网 发布:xp系统32位java下载 编辑:程序博客网 时间:2024/05/22 22:42

区间求积,暴int

#include<iostream>#include<cstdio>#define Mod 1000000007const int maxn = 50050;using namespace std;__int64 tree[maxn<<2];void work(int rt){    tree[rt] =(( tree[rt<<1]%Mod) *(tree[rt<<1|1]%Mod))%Mod;}void build(int l, int r, int rt){    if(l == r)    {        scanf("%d",&tree[rt]);        return;    }    int mid = (l+r)>>1;    build(l,mid,rt<<1);    build(mid+1,r,rt<<1|1);    work(rt);}void updata(int w,int val ,int l, int r, int rt){    if(l == r)    {        tree[rt] = val;        return;    }    int mid = (l+r)>>1;    if(w<=mid)        updata(w,val,l,mid,rt<<1);    else        updata(w,val,mid+1,r,rt<<1|1);    work(rt);}__int64 query(int x, int y, int l,int r, int rt){    if(x<=l&&r<=y)    {        return tree[rt];    }    __int64 ans = 1;    int mid = (l+r)>>1;    if(x<=mid)        ans = (ans*query(x,y,l,mid,rt<<1))%Mod;    if(mid<y)        ans = (ans*query(x,y,mid+1,r,rt<<1|1))%Mod;    return ans;}int main(){    int t,n,m,k,a,b;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        build(1,n,1);        scanf("%d",&m);        while(m--)        {            scanf("%d%d%d",&k,&a,&b);            if(k == 0)                printf("%I64d\n",query(a,b,1,n,1)%Mod);            else                 updata(a,b,1,n,1);        }    }    return 0;}
0 0
原创粉丝点击