Use this to learn the idea, then write your own version.
12 3 456import typing7 8 9def _ceil_pow2(n: int) -> int:10 x = 011 while (1 << x) < n:12 x += 113 14 return x15 16 17class LazySegTree:18 def __init__(19 self,20 op: typing.Callable[[typing.Any, typing.Any], typing.Any],21 e: typing.Any,22 mapping: typing.Callable[[typing.Any, typing.Any], typing.Any],23 composition: typing.Callable[[typing.Any, typing.Any], typing.Any],24 id_: typing.Any,25 v: typing.Union[int, typing.List[typing.Any]],26 ) -> None:27 self._op = op28 self._e = e29 self._mapping = mapping30 self._composition = composition31 self._id = id_32 33 if isinstance(v, int):34 v = [e] * v35 36 self._n = len(v)37 self._log = _ceil_pow2(self._n)38 self._size = 1 << self._log39 self._d = [e] * (2 * self._size)40 self._lz = [self._id] * self._size41 42 for i in range(self._n):43 self._d[self._size + i] = v[i]44 45 for i in range(self._size - 1, 0, -1):46 self._update(i)47 48 def set(self, p: int, x: typing.Any) -> None:49 assert 0 <= p < self._n50 51 p += self._size52 53 for i in range(self._log, 0, -1):54 self._push(p >> i)55 56 self._d[p] = x57 58 for i in range(1, self._log + 1):59 self._update(p >> i)60 61 def get(self, p: int) -> typing.Any:62 assert 0 <= p < self._n63 64 p += self._size65 66 for i in range(self._log, 0, -1):67 self._push(p >> i)68 69 return self._d[p]70 71 def prod(self, left: int, right: int) -> typing.Any:72 assert 0 <= left <= right <= self._n73 74 if left == right:75 return self._e76 77 left += self._size78 right += self._size79 80 for i in range(self._log, 0, -1):81 if ((left >> i) << i) != left:82 self._push(left >> i)83 84 if ((right >> i) << i) != right:85 self._push(right >> i)86 87 sml = self._e88 smr = self._e89 90 while left < right:91 if left & 1:92 sml = self._op(sml, self._d[left])93 left += 194 95 if right & 1:96 right -= 197 smr = self._op(self._d[right], smr)98 99 left >>= 1100 right >>= 1101 102 return self._op(sml, smr)103 104 def all_prod(self) -> typing.Any:105 return self._d[1]106 107 def apply(108 self,109 left: int,110 right: typing.Optional[int] = None,111 f: typing.Optional[typing.Any] = None,112 ) -> None:113 assert f is not None114 115 if right is None:116 p = left117 assert 0 <= left < self._n118 119 p += self._size120 121 for i in range(self._log, 0, -1):122 self._push(p >> i)123 124 self._d[p] = self._mapping(f, self._d[p])125 126 for i in range(1, self._log + 1):127 self._update(p >> i)128 else:129 assert 0 <= left <= right <= self._n130 131 if left == right:132 return133 134 left += self._size135 right += self._size136 137 for i in range(self._log, 0, -1):138 if ((left >> i) << i) != left:139 self._push(left >> i)140 141 if ((right >> i) << i) != right:142 self._push((right - 1) >> i)143 144 l2 = left145 r2 = right146 147 while left < right:148 if left & 1:149 self._all_apply(left, f)150 left += 1151 152 if right & 1:153 right -= 1154 self._all_apply(right, f)155 156 left >>= 1157 right >>= 1158 159 left = l2160 right = r2161 162 for i in range(1, self._log + 1):163 if ((left >> i) << i) != left:164 self._update(left >> i)165 166 if ((right >> i) << i) != right:167 self._update((right - 1) >> i)168 169 def max_right(self, left: int, g: typing.Callable[[typing.Any], bool]) -> int:170 assert 0 <= left <= self._n171 assert g(self._e)172 173 if left == self._n:174 return self._n175 176 left += self._size177 178 for i in range(self._log, 0, -1):179 self._push(left >> i)180 181 sm = self._e182 first = True183 184 while first or (left & -left) != left:185 first = False186 187 while left % 2 == 0:188 left >>= 1189 190 if not g(self._op(sm, self._d[left])):191 while left < self._size:192 self._push(left)193 left *= 2194 195 if g(self._op(sm, self._d[left])):196 sm = self._op(sm, self._d[left])197 left += 1198 199 return left - self._size200 201 sm = self._op(sm, self._d[left])202 left += 1203 204 return self._n205 206 def min_left(self, right: int, g: typing.Any) -> int:207 assert 0 <= right <= self._n208 assert g(self._e)209 210 if right == 0:211 return 0212 213 right += self._size214 215 for i in range(self._log, 0, -1):216 self._push((right - 1) >> i)217 218 sm = self._e219 first = True220 221 while first or (right & -right) != right:222 first = False223 right -= 1224 225 while right > 1 and right % 2:226 right >>= 1227 228 if not g(self._op(self._d[right], sm)):229 while right < self._size:230 self._push(right)231 right = 2 * right + 1232 233 if g(self._op(self._d[right], sm)):234 sm = self._op(self._d[right], sm)235 right -= 1236 237 return right + 1 - self._size238 239 sm = self._op(self._d[right], sm)240 241 return 0242 243 def _update(self, k: int) -> None:244 self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])245 246 def _all_apply(self, k: int, f: typing.Any) -> None:247 self._d[k] = self._mapping(f, self._d[k])248 249 if k < self._size:250 self._lz[k] = self._composition(f, self._lz[k])251 252 def _push(self, k: int) -> None:253 self._all_apply(2 * k, self._lz[k])254 self._all_apply(2 * k + 1, self._lz[k])255 self._lz[k] = self._id256 257 258def main():259 import sys260 261 input = sys.stdin.readline262 263 h, w, n = map(int, input().split())264 rcl = list()265 266 for i in range(n):267 ri, ci, li = map(int, input().split())268 ci -= 1269 rcl.append((ri, ci, ci + li, i))270 271 rcl = sorted(rcl, key=lambda x: x[0], reverse=True)272 a = [h] * w273 274 275 inf = 10**18276 lst = LazySegTree(min, inf, min, min, inf, a)277 ans = [0] * n278 279 for _, left, right, i in rcl:280 hi = lst.prod(left, right)281 ans[i] = hi282 283 lst.apply(left, right, hi - 1)284 285 print(*ans, sep="\n")286 287 288if __name__ == "__main__":289 main()290