#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
const int N=50005;
int sum[N<<2],lazy[N<<2];
void push(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void down(int rt,int l,int r)
{
if(lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
int m=l+((r-l)>>1);
sum[rt<<1]+=lazy[rt]*(m-l+1);
sum[rt<<1|1]+=lazy[rt]*(r-m);
lazy[rt]=0;
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return;
}
int mid=(l+r)>>1;
build(ls);build(rs);push(rt);
}
int queryqj(int L,int R,int l,int r,int rt)//区间和
{
if(L<=l&&r<=R) return sum[rt];
down(rt,l,r);
int mid=(l+r)>>1;
int ret=0;
if(L<=mid) ret+=queryqj(L,R,ls);
if(R>mid) ret+=queryqj(L,R,rs);
return ret;
}
int query(int x,int l,int r,int rt)//单点值
{
if(l==r) return sum[rt];
down(rt,l,r);
int mid=(l+r)>>1;
if(x<=mid) return query(x,ls);
else return query(x,rs);
}
void updateqj(int L,int R,int val,int l,int r,int rt)//区间更新
{
if(L<=l&&r<=R)
{
sum[rt]+=val;
lazy[rt]+=val*(r-l+1);
return;
}
down(rt,l,r);
int mid=(l+r)>>1;
if(L<=mid) updateqj(L,R,val,ls);
if(R>mid) updateqj(L,R,val,rs);
push(rt);
}
void update(int x,int val,int l,int r,int rt)//单点更新
{
if(l==r)
{
sum[rt]+=val;
return;
}
down(rt,l,r);
int mid=(l+r)>>1;
if(x<=mid) update(x,val,ls);
else update(x,val,rs);
push(rt);
}
int main()
{
}
线段树模板
最新推荐文章于 2024-10-11 21:43:15 发布