int ctz(int n) {
int res = 0;
if ((n & 0x0000ffff) == 0) n >>= 16, res += 16;
if ((n & 0x000000ff) == 0) n >>= 8, res += 8;
if ((n & 0x0000000f) == 0) n >>= 4, res += 4;
if ((n & 0x00000003) == 0) n >>= 2, res += 2;
if ((n & 0x00000001) == 0) n >>= 1, res += 1;
return res;
}
int lg(int n) {
int res = 1;
--n;
if (n >> 16) n >>= 16, res += 16;
if (n >> 8) n >>= 8, res += 8;
if (n >> 4) n >>= 4, res += 4;
if (n >> 2) n >>= 2, res += 2;
if (n >> 1) n >>= 1, res += 1;
return res;
}
int lg(long long n) {
int res = 1;
--n;
if (n >> 32) n >>= 32, res += 32;
if (n >> 16) n >>= 16, res += 16;
if (n >> 8) n >>= 8, res += 8;
if (n >> 4) n >>= 4, res += 4;
if (n >> 2) n >>= 2, res += 2;
if (n >> 1) n >>= 1, res += 1;
return res;
}
template <typename T> int log2ceil(T n) { return T(1) << lg(n); }
Back