区间修改区间查询里面用到了一个lazy tag方法
具体的意思就是: 要修改某区间(L,R)的值时,不修改到底,而是修改到L<=begin&&R>=end时,直接对begin到end区间的和进行修改,修改后在次节点做一个标记add[node]=x(x为修改值),如果add[node]不为零,说明我并没有将此节点的更改向下延伸到叶子节点。至于什么时候向下更新到叶子结点,则是到区间查询查询到此节点时进行更新。如果有重复的区间修改到此节点,把此节点得影响全部积攒到add数组。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#define ll long long
using namespace std;
ll N,Q;
ll a[100005],Tree[400005];
ll add[400005];//lazytag核心数组
void push_down(int node,int len){//更新函数
if(add[node]){
add[node<<1]+=add[node];
add[node<<1|1]+=add[node];
Tree[node<<1]+=(len-(len>>1))*add[node];
Tree[node<<1|1]+=(len>>1)*add[node];
add[node]=0;
}
}
void build(int node,int begin,int end){
if(begin==end){
Tree[nod