一维树状数组模板【pascal】

来源:互联网 发布:阿里云美国服务器 vpn 编辑:程序博客网 时间:2024/06/06 05:12

1、单点修改,区间查询

var        n,m,tt,x,y      :longint;        c               :array[0..500010] of longint;        i               :longint;function lowbit(x:longint):longint;begin   exit(x and (-x));end;procedure add(x,v:longint);begin   while (x<=n) do   begin      inc(c[x],v);      inc(x,lowbit(x));   end;end;function sum(x:longint):longint;var        ans:longint;begin   ans:=0;   while (x>0) do   begin      inc(ans,c[x]);      dec(x,lowbit(x));   end;   exit(ans);end;begin   read(n,m);   for i:=1 to n do   begin      read(x);      add(i,x);   end;   //   for i:=1 to m do   begin      read(tt,x,y);      if (tt=1) then add(x,y) else writeln(sum(y)-sum(x-1));   end;end.


2、区间修改,单点查询

var        n,m,tt,x,y,z    :longint;        c,a             :array[0..500010] of longint;        i,j             :longint;function lowbit(x:longint):longint;begin   exit(x and (-x));end;procedure add(x,v:longint);begin   while (x<=n) do   begin      inc(c[x],v);      inc(x,lowbit(x));   end;end;function sum(x:longint):longint;var        ans:longint;begin   ans:=0;   while (x>0) do   begin      inc(ans,c[x]);      dec(x,lowbit(x));   end;   exit(ans);end;begin   read(n,m);   for i:=1 to n do read(a[i]);   for i:=1 to n do add(i,a[i]-a[i-1]); //注意   //   for i:=1 to m do   begin      read(tt);      if (tt=1) then      begin         read(x,y,z);         add(x,z);         add(y+1,-z);      end else      begin         read(x);         writeln(sum(x));      end;   end;end.
——by Eirlys


0 0
原创粉丝点击