第二篇:范围更新,范围查询
#include<iostream>
using namespace std;
/*
线段树一般有两个操作,修改信息和查询信息
*/
const int maxn=10001;
int arr[maxn];//原数组
int sum[maxn<<2];//查询的累加和数组
int change[maxn<<2];//修改数组
bool isUpdate[maxn<<2];//判断是否有懒更新任务
/*将信息向上汇总*/
void up(int i){
sum[i]=sum[i<<1]+sum[i<<1|1];
}
/*懒加载*/
void lazy(int i,int v,int n){
sum[i]=v*n;
change[i]=v;
isUpdate[i]=true;
}
/*向下发懒更新信息*/
void down(int i,int ln,int rn){
if(isUpdate[i]){//如果当前节点有懒更新,就向下发
lazy(i<<1,change[i],ln);
lazy(i<<1|1,change[i],rn);
isUpdate[i]=false;
}
}
/*建树*/
void build(int l,int r,int i){
if(l==r){
sum[i]=arr[l];
}else{
int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
up(i);
}
change[i]=0;
isUpdate[i]=false;
}
/*执行更新任务*/
void update(int jobl,int jobr,int jobv,int l,int r,int i){
if(jobl<=l&&jobr>=r){
lazy(i,jobv,r-l+1);
}else{
int mid=(l+r)>>1;
down(i,mid-l+1,r-mid);
if(jobl<=mid){
update(jobl,jobr,jobv,l,mid,i<<1);
}
if(jobr>mid){
update(jobl,jobr,jobv,mid+1,r,i<<1|1);
}
up(i);
}
}
/*执行查询任务*/
int query(int jobl,int jobr,int l,int r,int i){
if(jobl<=l&&jobr>=r){
return sum[i];
}
int mid=(l+r)>>1;
down(i,mid-l+1,r-mid);
int ans=0;
if(jobl<=mid){
ans+=query(jobl,jobr,l,mid,i<<1);
}
if(jobr>=mid+1){
ans+=query(jobl,jobr,mid+1,r,i<<1|1);
}
return ans;
}
int main()
{
return 0;
}