首页 > 其他 > 详细

线段树小结

时间:2015-10-27 14:48:39      阅读:250      评论:0      收藏:0      [点我收藏+]

单点增加,区间求和

技术分享
program ex1;
var
  data:array[0..400000]of int64;
  a:array[0..100000]of int64;
  n,i,m,c,x,y:longint;
procedure build(p,l,r:longint);
var mid:longint;
begin
  if l=r then data[p]:=a[r]
   else if l<r then
   begin
     mid:=(l+r) div 2; build(p*2,l,mid); build(p*2+1,mid+1,r);
     data[p]:=data[p*2]+data[p*2+1];
   end;
end;
procedure add(p,l,r,x,num:longint);
var mid:longint;
begin
  if l=r then inc(data[p],num)
  else
   begin
    mid:=(l+r) div 2;
    if x<=mid then add(p*2,l,mid,x,num);
    if x>mid then add(p*2+1,mid+1,r,x,num);
    data[p]:=data[p*2]+data[p*2+1];
   end;
end;
function query(p,l,r,x,y:longint):int64;
var mid,ans:int64;
begin
  if (x<=l)and(r<=y) then exit(data[p])
  else
    begin
     mid:=(l+r) div 2; ans:=0;
     if x<=mid then inc(ans,query(p*2,l,mid,x,y));
     if y>mid then inc(ans,query(p*2+1,mid+1,r,x,y));
     exit(ans);
    end;
end;
begin
  readln(n);
  for i:=1 to n do readln(a[i]);
  build(1,1,n);
  readln(m);
  for i:=1 to m do
   begin
     readln(c,x,y);
     if c=1 then add(1,1,n,x,y) else writeln(query(1,1,n,x,y));
   end;
end.
View Code

 

区间增加,区间求和

 

线段树小结

原文:http://www.cnblogs.com/qtyytq/p/4913895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!