1. 程式人生 > >hdu3074Multiply game(線段樹---單點更新,區間求值)

hdu3074Multiply game(線段樹---單點更新,區間求值)

1.題目連結:

2.參考程式碼:

#include <cstdio>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=55555;
__int64 ans[maxn<<2];

void PushUP(int rt){
	ans[rt]=ans[rt<<1]%1000000007*ans[rt<<1|1]%1000000007;
}

void build(int l,int r,int rt){
	if(l==r)
	{
		scanf("%I64d",&ans[rt]);
		return ;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	PushUP(rt);
}

void update(int p,int c,int l,int r,int rt){
	if(l==r)
	{
		ans[rt]=c;
		return ;
	}
	int m=(l+r)>>1;
	if(p<=m)
		update(p,c,lson);
	else
		update(p,c,rson);
	PushUP(rt);
}

__int64 query(int L,int R,int l,int r,int rt){
	if(L<=l && r<=R)
		return ans[rt];
	int m=(l+r)>>1;
	__int64 pos=1;
	if(L<=m)
	{
		pos=pos%1000000007;
		pos*=query(L,R,lson);
	}
	if(R>m)
	{
		pos=pos%1000000007;
		pos*=query(L,R,rson);
	}
	return pos%1000000007;
}

int main()
{
	int t,n,m,a,b,c;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		build(1,n,1);
		scanf("%d",&m);
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(a==1)
				update(b,c,1,n,1);
			else
				printf("%d\n",query(b,c,1,n,1)%1000000007);
		}
	}
	return 0;
}