1、定义变量:
#define LL long long
const int Max = 1e5+5;
int n,q;
LL sum[Max>>2]={0};
LL lazy[Max>>2]={0};
LL a[Max];
push_up函数:
void push_up(int k)
{
sum[k]=sum[k<<1]+sum[k<<1|1];
}
push_down函数:
void push_down(int k,int L,int R)
{
int len = (R-L+1);
lazy[k<<1]+=lazy[k];
sum[k<<1]+=lazy[k]*(len-(len>>1));
lazy[k<<1|1]+=lazy[k];
sum[k<<1|1]+=lazy[k]*(len>>1);
lazy[k]=0;
}
建树:
void build(int L,int R,int k)
{
if(L==R)
{
sum[k] = a[L];
return ;
}
int mid = (L+R)>>1;
build(L,mid,k<<1);
build(mid+1,R,k<<1|1);
push_up(k);
}
区间更新(这里以区间和为例)
void update(int L,int R,int ql,int qr,int score,int k)
{
if(ql<=L && qr>=R)
{
lazy[k]+=score;
sum[k]+=(R-L+1)*score;
return ;
}
if(lazy[k]) push_down(k,L,R);
int mid = (L+R)>>1;
if(ql<=mid) update(L,mid,ql,qr,score,k<<1);
if(qr>mid) update(mid+1,R,ql,qr,score,k<<1|1);
push_up(k);
}
区间查询
LL query(int L,int R,int ql,int qr,int k)
{
LL ret=0;
if(ql<=L && qr>=R)
{
return sum[k];
}
int mid = (L+R)>>1;
int ls =k<<1;
int rs = k<<1|1;
if(lazy[k]) push_down(k,L,R);
if(ql<=mid ) ret+=query(L,mid,ql,qr,ls);
if(qr>mid) ret+=query(mid+1,R,ql,qr,rs);
return ret;
}