#include using i64 = long long; template class SegmentTree { int size; T id; T *dat; F f; T query_impl(const int a, const int b, const int k, const int l, const int r) const { if (r <= a || b <= l) return id; if (a <= l && r <= b) return dat[k]; return f(query_impl(a, b, k * 2 + 1, l, (l + r) / 2), query_impl(a, b, k * 2 + 2, (l + r) / 2, r)); } public: SegmentTree(const int n, const T &id, const F f) : id(id), f(f) { size = 2; while (size < n) size *= 2; dat = new T[2 * size - 1]; for (int i = 0; i < 2 * size - 1; i++) dat[i] = id; } template