Use this to learn the idea, then write your own version.
12 3 4import typing5 6 7def _ceil_pow2(n: int) -> int:8 x = 09 while (1 << x) < n:10 x += 111 12 return x13 14 15class LazySegTree:16 def __init__(17 self,18 op: typing.Callable[[typing.Any, typing.Any], typing.Any],19 e: typing.Any,20 mapping: typing.Callable[[typing.Any, typing.Any], typing.Any],21 composition: typing.Callable[[typing.Any, typing.Any], typing.Any],22 id_: typing.Any,23 v: typing.Union[int, typing.List[typing.Any]],24 ) -> None:25 self._op = op26 self._e = e27 self._mapping = mapping28 self._composition = composition29 self._id = id_30 31 if isinstance(v, int):32 v = [e] * v33 34 self._n = len(v)35 self._log = _ceil_pow2(self._n)36 self._size = 1 << self._log37 self._d = [e] * (2 * self._size)38 self._lz = [self._id] * self._size39 for i in range(self._n):40 self._d[self._size + i] = v[i]41 for i in range(self._size - 1, 0, -1):42 self._update(i)43 44 def set(self, p: int, x: typing.Any) -> None:45 assert 0 <= p < self._n46 47 p += self._size48 for i in range(self._log, 0, -1):49 self._push(p >> i)50 self._d[p] = x51 for i in range(1, self._log + 1):52 self._update(p >> i)53 54 def get(self, p: int) -> typing.Any:55 assert 0 <= p < self._n56 57 p += self._size58 for i in range(self._log, 0, -1):59 self._push(p >> i)60 return self._d[p]61 62 def prod(self, left: int, right: int) -> typing.Any:63 assert 0 <= left <= right <= self._n64 65 if left == right:66 return self._e67 68 left += self._size69 right += self._size70 71 for i in range(self._log, 0, -1):72 if ((left >> i) << i) != left:73 self._push(left >> i)74 if ((right >> i) << i) != right:75 self._push(right >> i)76 77 sml = self._e78 smr = self._e79 while left < right:80 if left & 1:81 sml = self._op(sml, self._d[left])82 left += 183 if right & 1:84 right -= 185 smr = self._op(self._d[right], smr)86 left >>= 187 right >>= 188 89 return self._op(sml, smr)90 91 def all_prod(self) -> typing.Any:92 return self._d[1]93 94 def apply(95 self,96 left: int,97 right: typing.Optional[int] = None,98 f: typing.Optional[typing.Any] = None,99 ) -> None:100 assert f is not None101 102 if right is None:103 p = left104 assert 0 <= left < self._n105 106 p += self._size107 for i in range(self._log, 0, -1):108 self._push(p >> i)109 self._d[p] = self._mapping(f, self._d[p])110 for i in range(1, self._log + 1):111 self._update(p >> i)112 else:113 assert 0 <= left <= right <= self._n114 if left == right:115 return116 117 left += self._size118 right += self._size119 120 for i in range(self._log, 0, -1):121 if ((left >> i) << i) != left:122 self._push(left >> i)123 if ((right >> i) << i) != right:124 self._push((right - 1) >> i)125 126 l2 = left127 r2 = right128 while left < right:129 if left & 1:130 self._all_apply(left, f)131 left += 1132 if right & 1:133 right -= 1134 self._all_apply(right, f)135 left >>= 1136 right >>= 1137 left = l2138 right = r2139 140 for i in range(1, self._log + 1):141 if ((left >> i) << i) != left:142 self._update(left >> i)143 if ((right >> i) << i) != right:144 self._update((right - 1) >> i)145 146 def max_right(self, left: int, g: typing.Callable[[typing.Any], bool]) -> int:147 assert 0 <= left <= self._n148 assert g(self._e)149 150 if left == self._n:151 return self._n152 153 left += self._size154 for i in range(self._log, 0, -1):155 self._push(left >> i)156 157 sm = self._e158 first = True159 while first or (left & -left) != left:160 first = False161 while left % 2 == 0:162 left >>= 1163 if not g(self._op(sm, self._d[left])):164 while left < self._size:165 self._push(left)166 left *= 2167 if g(self._op(sm, self._d[left])):168 sm = self._op(sm, self._d[left])169 left += 1170 return left - self._size171 sm = self._op(sm, self._d[left])172 left += 1173 174 return self._n175 176 def min_left(self, right: int, g: typing.Any) -> int:177 assert 0 <= right <= self._n178 assert g(self._e)179 180 if right == 0:181 return 0182 183 right += self._size184 for i in range(self._log, 0, -1):185 self._push((right - 1) >> i)186 187 sm = self._e188 first = True189 while first or (right & -right) != right:190 first = False191 right -= 1192 while right > 1 and right % 2:193 right >>= 1194 if not g(self._op(self._d[right], sm)):195 while right < self._size:196 self._push(right)197 right = 2 * right + 1198 if g(self._op(self._d[right], sm)):199 sm = self._op(self._d[right], sm)200 right -= 1201 return right + 1 - self._size202 sm = self._op(self._d[right], sm)203 204 return 0205 206 def _update(self, k: int) -> None:207 self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])208 209 def _all_apply(self, k: int, f: typing.Any) -> None:210 self._d[k] = self._mapping(f, self._d[k])211 if k < self._size:212 self._lz[k] = self._composition(f, self._lz[k])213 214 def _push(self, k: int) -> None:215 self._all_apply(2 * k, self._lz[k])216 self._all_apply(2 * k + 1, self._lz[k])217 self._lz[k] = self._id218 219 220def main():221 import sys222 223 input = sys.stdin.readline224 225 n, m = map(int, input().split())226 inf = 10**18227 a = list(map(int, input().split())) + [inf] * 5228 b = list(map(int, input().split()))229 230 def mapping(x, y):231 return x + y232 233 def composition(x, y):234 return x + y235 236 lazy_st = LazySegTree(237 op=min, e=inf, mapping=mapping, composition=composition, id_=0, v=a238 )239 240 for bi in b:241 ai = lazy_st.get(bi)242 243 if ai == 0:244 continue245 246 p, q = divmod(ai, n)247 lazy_st.set(bi, 0)248 lazy_st.apply(0, n, p)249 diff = (n - 1) - bi250 251 if 1 <= q <= diff:252 lazy_st.apply(bi + 1, bi + q + 1, 1)253 elif q > diff:254 lazy_st.apply(bi + 1, n, 1)255 lazy_st.apply(0, q - diff, 1)256 257 ans = list()258 259 for i in range(n):260 ans.append(lazy_st.get(i))261 262 print(*ans)263 264 265if __name__ == "__main__":266 main()267