bulid
procedure bulid(v,l,r:longint);
var mid:longint;
begin
mark[v]:=0;
if l=r then tree[v]:=a[l]
else begin
mid:=(l+r) >> 1;
bulid(v+v,l,mid);
bulid(v+v+1,mid+1,r);
tree[v]:=tree[v+v]+tree[v+v+1];
end;
end;
单点修改的线段树维护
单点修改
procedure modify(v,l,r,i,val:longint);
var mid:longint;
begin
if l=r then begin tree[v]:=tree[v]+val; exit; end;
mid:=(l+r) >> 1;
if i<=mid then modify(v+v,l,mid,i,val)
else modify(v+v+1,mid+1,r,i,val);
tree[v]:=tree[v+v]+tree[v+v+1];
end;
查找
function search(v,l,r,x,y:longint):longint;
var mid:longint;
begin
if (l=x) and (r=y) then exit(tree[v]);
mid:=(l+r) >> 1;
if y<=mid then exit(search(v+v,l,mid,x,y))
else if x>=mid+1 then exit(search(v+v+1,mid+1,r,x,y))
else exit(search(v+v,l,mid,x,mid)+search(v+v+1,mid+1,r,mid+1,y));
end;
区间修改线段树维护
区间修改
procedure modify(v,l,r,x,y,val:longint);
var mid:longint;
begin
//writeln(v,' ',l,' ',r,' ',x,' ',y,' ',val);
if (l=x) and (r=y) then
begin
mark[v]:=mark[v]+val;
exit;
end;
mid:=(l+r) >> 1;
mark[v+v]:=mark[v+v]+mark[v];
mark[v+v+1]:=mark[v+v+1]+mark[v];
mark[v]:=0;
if y<=mid then modify(v+v,l,mid,x,y,val)
else if x>=mid+1 then modify(v+v+1,mid+1,r,x,y,val)
else begin modify(v+v,l,mid,x,mid,val); modify(v+v+1,mid+1,r,mid+1,y,val); end;
tree[v]:=tree[v+v]+tree[v+v+1]+mark[v+v]*(mid-l+1)+mark[v+v+1]*(r-mid);
end;
查找
function search(v,l,r,x,y:longint):int64;
var mid:longint;
begin
if (l=x) and (r=y) then exit(tree[v]+(r-l+1)*mark[v]);
mid:=(l+r) >> 1;
if y<=mid then exit(search(v+v,l,mid,x,y)+(y-x+1)*mark[v])
else if x>=mid+1 then exit(search(v+v+1,mid+1,r,x,y)+(y-x+1)*mark[v])
else exit(search(v+v,l,mid,x,mid)+search(v+v+1,mid+1,r,mid+1,y)+(y-x+1)*mark[v]);
end;