22 " https://onlinejudge.u-aizu.ac.jp/problems/ITP1_1_A"
33#include " ../template.hpp"
44#include " ../../../library/data_structures_[l,r)/seg_tree_midpoint.hpp"
5+ int lg (int x) { return bit_width (x + 0u ) - 1 ; }
56int main () {
67 cin.tie (0 )->sync_with_stdio (0 );
78 rep (n, 1 , 5000 ) {
89 auto dfs = [&](auto && self, int tl, int tr,
910 int v) -> void {
1011 assert ((v >= n) == ((tr - tl) == 1 ));
1112 if (v >= n) { // leaf node
12- const int depth_leaf = __lg (v),
13- max_depth = __lg (2 * n - 1 );
13+ const int depth_leaf = lg (v),
14+ max_depth = lg (2 * n - 1 );
1415 if (tl == 0 ) { // left-most leaf
1516 assert (v == (1 << max_depth));
1617 assert (depth_leaf == max_depth);
@@ -25,30 +26,30 @@ int main() {
2526 if (((tr - tl) & (tr - tl - 1 )) == 0 )
2627 assert (split (tl, tr) == (tl + tr) / 2 );
2728 {
28- int pow_2 = 1 << __lg (tr - tl);
29+ int pow_2 = bit_floor (tr - tl + 0u );
2930 if (tl + pow_2 < tr - pow_2 / 2 ) {
3031 assert (pow_2 != tr - tl);
3132 assert (pow_2 / 2 < tr - tl - pow_2 &&
3233 tr - tl - pow_2 < pow_2);
3334 assert (
3435 pow_2 <= 2 * (tr - tl - pow_2) - 1 &&
3536 2 * (tr - tl - pow_2) - 1 < 2 * pow_2 - 1 );
36- assert (__lg (pow_2) ==
37- __lg (2 * ((tr - tl) - pow_2) - 1 ) &&
38- __lg (pow_2) == __lg (2 * pow_2 - 1 ));
37+ assert (lg (pow_2) ==
38+ lg (2 * ((tr - tl) - pow_2) - 1 ) &&
39+ lg (pow_2) == lg (2 * pow_2 - 1 ));
3940 } else if (pow_2 < tr - tl) {
4041 assert (pow_2 / 2 < tr - tl - pow_2 / 2 &&
4142 tr - tl - pow_2 / 2 <= pow_2);
4243 assert (
4344 pow_2 <= 2 * ((tr - tl) - pow_2 / 2 ) - 1 &&
4445 2 * ((tr - tl) - pow_2 / 2 ) - 1 <=
4546 2 * pow_2 - 1 );
46- assert (__lg (2 * (tr - tl - pow_2 / 2 ) - 1 ) ==
47- __lg (2 * pow_2 - 1 ));
48- assert (__lg (2 * ((tr - tl) - pow_2 / 2 ) - 1 ) ==
49- __lg (pow_2));
50- assert (__lg (pow_2) ==
51- 1 + __lg (2 * (pow_2 / 2 ) - 1 ));
47+ assert (lg (2 * (tr - tl - pow_2 / 2 ) - 1 ) ==
48+ lg (2 * pow_2 - 1 ));
49+ assert (lg (2 * ((tr - tl) - pow_2 / 2 ) - 1 ) ==
50+ lg (pow_2));
51+ assert (
52+ lg (pow_2) == 1 + lg (2 * (pow_2 / 2 ) - 1 ));
5253 }
5354 }
5455 int tm = split (tl, tr);
0 commit comments