class Lazy_Evaluation_Tree(): def __init__(self,L,calc,unit,op,comp,id,index): """calcを演算,opを作用とするリストLのSegment Treeを作成 calc:演算 unit:モノイドcalcの単位元 (xe=ex=xを満たすe) op:作用素 comp:作用素の合成 id:恒等写像 [条件] M:Monoid,F={f:F x M→ M:作用素}に対して,以下が成立する. Fは恒等写像 id を含む.つまり,任意の x in M に対して id(x)=x Fは写像の合成に閉じている.つまり,任意の f,g in F に対して, comp(f,g) in F 任意の f in F, x,y in M に対して,f(xy)=f(x)f(y)である. [注記] 作用素は左から掛ける.更新も左から. """ self.calc=calc self.unit=unit self.op=op self.comp=comp self.id=id self.index=index N=len(L) d=max(1,(N-1).bit_length()) k=1<>h) #配列の第m要素より上を全て再計算 def _recalc_above(self,m): while m>1: m>>=1 self.data[m]=self.calc( self._eval_at(m<<1), self._eval_at(m<<1|1) ) def get(self,k): index=self.index m=k-index+self.N self._propagate_above(m) self.data[m]=self._eval_at(m) self.lazy[m]=self.id return self.data[m] #作用 def operate(self,From,To,alpha,left_closed=True,right_closed=True): index=self.index L=(From-index)+self.N+(not left_closed) R=(To-index)+self.N+(right_closed) L0=R0=-1 X,Y=L,R-1 while X>=1 Y>>=1 L0=max(L0,X) R0=max(R0,Y) self._propagate_above(L0) self._propagate_above(R0) while L>=1 R>>=1 self._recalc_above(L0) self._recalc_above(R0) def update(self,k,x): """ 第k要素をxに変更する. """ index=self.index m=k-index+self.N self._propagate_above(m) self.data[m]=x self.lazy[m]=self.id self._recalc_above(m) def product(self,From,To,left_closed=True,right_closed=True): index=self.index L=(From-index)+self.N+(not left_closed) R=(To-index)+self.N+(right_closed) L0=R0=-1 X,Y=L,R-1 while X>=1 Y>>=1 L0=max(L0,X) R0=max(R0,Y) self._propagate_above(L0) self._propagate_above(R0) vL=vR=self.unit while L>=1 R>>=1 return self.calc(vL,vR) def all_product(self): return self.product(1,self.N,1) #リフレッシュ def refresh(self): for m in range(1,2*self.N): self.data[m]=self._eval_at(m) if m1: C=L+(R-L)//2 if cond(C): R=C else: L=C return R else: while (R-L)>=ep and Times: Times-=1 C=L+(R-L)/2 if cond(C): R=C else: L=C return R def General_Binary_Decrease_Search(L,R,cond,Integer=True,ep=1/(1<<20),Times=50): """条件式が単調減少であるとき,一般的な二部探索を行う. L:解の下限 R:解の上限 cond:条件(1変数関数,広義単調減少 or 広義単調減少を満たす) Integer:解を整数に制限するか? ep:Integer=Falseのとき,解の許容する誤差 """ if not(cond(L)): return None if cond(R): return R if Integer: L-=1 while R-L>1: C=L+(R-L)//2 if cond(C): L=C else: R=C return L else: while (R-L)>=ep and Times: Times-=1 C=L+(R-L)/2 if cond(C): L=C else: R=C return L #================================================ def op(a,x): if a>=0: return x-a else: return -a def comp(a,b): if a<0: return a else: if b<0: return b-a else: return a+b import sys input=sys.stdin.readline write=sys.stdout.write N,Q=map(int,input().split()) A=["*"]+list(map(int,input().split())) A_cum=[0]*(N+1) for i in range(N): A_cum[i+1]=A[i+1]+A_cum[i] S=Lazy_Evaluation_Tree(list(range(1,N+1)),max,0,op,comp,0,1) X=[] for _ in range(Q): T,l,r=map(int,input().split()) L=General_Binary_Increase_Search(1,N,lambda x:S.product(x,x)>=l) R=General_Binary_Decrease_Search(1,N,lambda x:S.product(x,x)<=r) if T==1: move=S.product(R,R)-S.product(L,L) S.operate(L,R,-L) if R+1<=N: S.operate(R+1,N,move) S.refresh() else: X.append(A_cum[R]-A_cum[L-1]) write("\n".join(map(str,X)))