[docs]22defadd(self,h:int,w:int,x:int)->None:23"""Add x to a[h][w]. / O(logH * logW)"""24assert0<=h<self._h-1,f"IndexError"25assert0<=w<self._w-1,f"IndexError"26h+=127w+=128_h,_w,_bit=self._h,self._w,self._bit29whileh<_h:30j=w31whilej<_w:32_bit[h*_w+j]+=x33j+=j&-j34h+=h&-h
4041def_sum(self,h:int,w:int)->int:42"""Return sum([0, h) x [0, w)) of a. / O(logH * logW)"""43assert0<=h<self._h,f"IndexError"44assert0<=w<self._w,f"IndexError"45ret=046_w,_bit=self._w,self._bit47whileh>0:48j=w49whilej>0:50ret+=_bit[h*_w+j]51j-=j&-j52h-=h&-h53returnret54
[docs]55defsum(self,h1:int,w1:int,h2:int,w2:int)->int:56"""Retrun sum([h1, h2) x [w1, w2)) of a. / O(logH * logW)"""57assert0<=h1<=h2<self._h,f"IndexError"58assert0<=w1<=w2<self._w,f"IndexError"59return(60self._sum(h2,w2)61-self._sum(h2,w1)62-self._sum(h1,w2)63+self._sum(h1,w1)64)