离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树。
纯模板,就是把单点更新,区间求和改为单点更新,区间求积。
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; }