区间加法乘法修改,区间查询
1 #include2 #include 3 using namespace std; 4 int p; 5 long long a[100005]; 6 struct node{ 7 long long v, mul, add; 8 }st[500005]; 9 void bt(int root, int l, int r){ 10 //初始化lazytag 11 st[root].mul=1; 12 st[root].add=0; 13 if(l==r){ 14 st[root].v=a[l]; 15 } 16 else{ 17 int m=(l+r)/2; 18 bt(root*2, l, m); 19 bt(root*2+1, m+1, r); 20 st[root].v=st[root*2].v+st[root*2+1].v; 21 } 22 st[root].v%=p; 23 return ; 24 } 25 void pushdown(int root, int l, int r){ 26 int m=(l+r)/2; 27 //儿子的值=此刻儿子的值*爸爸的乘法lazytag+儿子的区间长度*爸爸的加法lazytag 28 st[root*2].v=(st[root*2].v*st[root].mul+st[root].add*(m-l+1))%p; 29 st[root*2+1].v=(st[root*2+1].v*st[root].mul+st[root].add*(r-m))%p; 30 st[root*2].mul=(st[root*2].mul*st[root].mul)%p; 31 st[root*2+1].mul=(st[root*2+1].mul*st[root].mul)%p; 32 st[root*2].add=(st[root*2].add*st[root].mul+st[root].add)%p; 33 st[root*2+1].add=(st[root*2+1].add*st[root].mul+st[root].add)%p; 34 //把父节点的值初始化 35 st[root].mul=1; 36 st[root].add=0; 37 return ; 38 } 39 //乘法,stdl此刻, l给出的 40 void ud1(int root, int stdl, int stdr, int l, int r, long long k){ 41 if(r