hdu3074Multiply game(線段樹---單點更新,區間求值)
阿新 • • 發佈:2019-01-07
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; }