範囲作用を2回やって、fとgが順不同で重なっているデモ
>>> range_update(table, 3, 10, lambda x: "f")
>>> range_update(table, 5, 15, lambda x: "g")
>>> debugprint(table)
| 0 |
| 0 | 0 |
| 0 | f | g | 0 |
| 0 | 0 | 0 | g | f | 0 | g | 0 |
|0|0|0|f|0|g|0|0|0|0|0|0|0|0|g|0|
可換でない時の正しいやり方
lambda x: "g"は、下伝搬の二項演算lambda x, y: x if x else yのxに"g"が入ったもの
python>>> table = [0] * SEGTREE_SIZE
>>> range_update(table, 3, 10, lambda x: "f")
>>> down_propagate(table, up(5), lambda x, y: x if x else y, 0)
>>> down_propagate(table, up(15), lambda x, y: x if x else y, 0)
>>> debugprint(table)
| 0 |
| 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | f | f | 0 | 0 | 0 |
|0|0|0|f|f|f|0|0|0|0|0|0|0|0|0|0|
>>> range_update(table, 5, 15, lambda x: "g")
>>> debugprint(table)
| 0 |
| 0 | 0 |
| 0 | 0 | g | 0 |
| 0 | 0 | 0 | g | f | 0 | g | 0 |
|0|0|0|f|f|g|0|0|0|0|0|0|0|0|g|0|
付録: 下への伝搬の影響範囲