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.