long[] sum;
long[] lazy;
int n;
void work() {
n=ni();
sum=new long[n<<2];
lazy=new long[n<<2];
}
private long query(int node,int s, int e, int l, int r) {
int m=l+(r-l)/2;
push(node,l,r);
if(s<=l&&r<=e){
return sum[node];
}
long ret=0;
if(s<=m){
ret+=query(node<<1,s,e,l,m);
}
if(e>=m+1){
ret+=query(node<<1|1,s,e,m+1,r);
}
return ret;
}
private void push(int node, int l, int r) {
int m=l+(r-l)/2;
if(l!=r){
lazy[node<<1]+=lazy[node];
sum[node<<1]+=(m-l+1)*lazy[node];
lazy[node<<1|1]+=lazy[node];
sum[node<<1|1]+=(r-m)*lazy[node];
}
lazy[node]=0;
}
private void add(int node,int s, int e, long v, int l, int r) {
if(s<=l&&r<=e){
sum[node]+=(r-l+1)*v;
lazy[node]+=v;
return;
}
push(node,l,r);
int m=l+(r-l)/2;
if(s<=m){
add(node<<1,s,e,v,l,m);
}
if(e>=m+1){
add(node<<1|1,s,e,v,m+1,r);
}
sum[node]=sum[node<<1]+sum[node<<1|1];
}
模板:线段树
最新推荐文章于 2022-10-28 22:13:03 发布