/// --- SegmentTree Library --- /// template function constexpr mmin(){ return [](T x, T y){return x function constexpr mmax(){ return [](T x, T y){return x>y?x:y;}; } template function constexpr madd(){ return [](T x, T y){return x+y;}; } template &FUNC> struct SegTree{ T data[SIZE*4]; int m; T def = DEF; function func = FUNC; SegTree(){ m=1; while(m0) { i = (i-1)>>1; data[i] = func(data[i*2+1], data[i*2+2]); } } T query(int a, int b, int k=0,int l=0, int r=-1){ if(r<0) r=m; if(b<=l||r<=a) return def; if(a<=l&&r<=b) return data[k]; return func( query(a, b, k*2+1, l, (l+r)/2), query(a, b, k*2+2, (l+r)/2, r) ); } T get(int i) { return data[i + m - 1]; } void dum(int l = -1, int r = -1) { if(!DEBUG) return; if(l<0) l = 0; if(r<0) r = m; l = max(0, l); r = min(m, r); cerr<(); using RMQ = SegTree; RMQ tree; /// ------ ///