T1 积木游戏             

     树状数组的一个简单应用,建立一个维护左节点的树状数组和一个维护右节点的树状数组,对于add操作,只要在维护左节点的树状数组l处加1,维护右节点的树状数组r处加1,那么询问[l,r]的答案就是左节点数组的r前缀和减去右节点数组的l-1前缀和。

var
  q,suml,sumr,i,j,k,l,r,m,n:longint;
  cl,cr:array[0..60005] of longint;

{file}
procedure openf;
begin
  assign(input,'block.in'); reset(input);
  assign(output,'block.out'); rewrite(output);
end;
procedure closef;
begin
  close(input); close(output);
  halt;
end;

{lowbit}
function lowbit(p:longint):longint;
begin
  exit(p and -p);
end;

{add}
procedure addl(x,num:longint);
begin
  while x<=n+1 do
  begin
    inc(cl[x],num);
    x:=x+lowbit(x);
  end;
end;
procedure addr(x,num:longint);
begin
  while x<=n+1 do
  begin
    inc(cr[x],num);
    x:=x+lowbit(x);
  end;
end;

{get}
procedure getsuml(x:longint);
begin
  suml:=0;
  while x>0 do
  begin
    inc(suml,cl[x]);
    x:=x-lowbit(x);
  end;
end;
procedure getsumr(x:longint);
begin
  sumr:=0;
  while x>0 do
  begin
    inc(sumr,cr[x]);
    x:=x-lowbit(x);
  end;
end;

begin
  {input}
  openf;
  readln(n,m);
  
  {doit}
  for i:=1 to m do
  begin
    readln(q,l,r);
    if q=1 then begin
      addl(l,1);
      addr(r,1);
    end;
    if q=2 then begin
      getsuml(r);
      getsumr(l-1);
      writeln(suml-sumr);
    end;
  end;
  closef;
end.
View Code 1

相关文章: