結果
問題 | No.1099 Range Square Sum |
ユーザー |
|
提出日時 | 2021-06-21 23:43:50 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,912 ms / 2,000 ms |
コード長 | 4,738 bytes |
コンパイル時間 | 230 ms |
コンパイル使用メモリ | 82,688 KB |
実行使用メモリ | 286,784 KB |
最終ジャッジ日時 | 2024-06-22 22:57:46 |
合計ジャッジ時間 | 18,495 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
import sysinput = lambda : sys.stdin.readline().rstrip()sys.setrecursionlimit(2*10**5+10)write = lambda x: sys.stdout.write(x+"\n")debug = lambda x: sys.stderr.write(x+"\n")writef = lambda x: print("{:.12f}".format(x))### 遅延評価セグメント木(はやい非DFS)class LSG:def __init__(self,n, a=None):self._n = nself._ninf = ninfself._op = opself._mapping = mappingself._composition = compositionself._f0 = f0x = 0while (1 << x) < self._n:x += 1self._log = xself._size = 1 << self._logself._d = [self._ninf] * (2 * self._size)self._lz = [self._f0] * self._sizeif a is not None:for i in range(self._n):self._d[self._size + i] = a[i]for i in range(self._size - 1, 0, -1):self._update(i)def check(self):return [self.query_point(p) for p in range(self._n)]def update_point(self, p, x):p += self._sizefor i in range(self._log, 0, -1):self._push(p >> i)self._d[p] = xfor i in range(1, self._log + 1):self._update(p >> i)def query_point(self, p):p += self._sizefor i in range(self._log, 0, -1):self._push(p >> i)return self._d[p]def query(self, left, right):if left == right:return self._ninfleft += self._sizeright += self._sizefor i in range(self._log, 0, -1):if ((left >> i) << i) != left:self._push(left >> i)if ((right >> i) << i) != right:self._push(right >> i)sml = self._ninfsmr = self._ninfwhile left < right:if left & 1:sml = self._op(sml, self._d[left])left += 1if right & 1:right -= 1smr = self._op(self._d[right], smr)left >>= 1right >>= 1return self._op(sml, smr)def query_all(self):return self._d[1]def update(self, left, right, f):if right is None:p = leftp += self._sizefor i in range(self._log, 0, -1):self._push(p >> i)self._d[p] = self._mapping(f, self._d[p])for i in range(1, self._log + 1):self._update(p >> i)else:if left == right:returnleft += self._sizeright += self._sizefor i in range(self._log, 0, -1):if ((left >> i) << i) != left:self._push(left >> i)if ((right >> i) << i) != right:self._push((right - 1) >> i)l2 = leftr2 = rightwhile left < right:if left & 1:self._all_apply(left, f)left += 1if right & 1:right -= 1self._all_apply(right, f)left >>= 1right >>= 1left = l2right = r2for i in range(1, self._log + 1):if ((left >> i) << i) != left:self._update(left >> i)if ((right >> i) << i) != right:self._update((right - 1) >> i)def _update(self, k):self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])def _all_apply(self, k, f) -> None:self._d[k] = self._mapping(f, self._d[k])if k < self._size:self._lz[k] = self._composition(f, self._lz[k])def _push(self, k):self._all_apply(2 * k, self._lz[k])self._all_apply(2 * k + 1, self._lz[k])self._lz[k] = self._f0def loc(self, l, r):return self._lz[self._size+l : self._size+r]ninf = (0,0,0) # (和, 積和, 個数)f0 = 0def op(x,y):return (x[0]+y[0], x[1]+y[1]+x[0]*y[0], x[2]+y[2])def mapping(f,x):return (x[0] + f*x[2],x[1] + x[0]*f*(x[2]-1) + f*f*x[2]*(x[2]-1)//2,x[2])# composition: あとからきたクエリがf1に入るdef composition(f1,f2):return f1+f2n = int(input())a = list(map(int, input().split()))sg = LSG(n, [(v,0,1) for v in a])q = int(input())ans = []for i in range(q):s = input().split()if s[0]=="1":_,l,r,x = map(int, s)l -= 1r -= 1sg.update(l,r+1,x)else:_,l,r = map(int, s)l -= 1r -= 1val = sg.query(l,r+1)# print(val)ans.append(val[0]**2-2*val[1])write("\n".join(map(str, ans)))