Segment Tree === ###### tags: `Algorithm` ## 思路 * root = 1, left node = (n<<1), right node = (n<<1|1) * build * set l, r * if (l==r) get arr value * else gen child, pull(merge) * query * if query cover node complete * return val * else if l or r touched * query l or r (query don't change), merge ## Code ```cpp #define maxN (1000000+10) #define L(x) (x<<1) #define R(x) ((x<<1)|1) //st int l[maxN], r[maxN], val[maxN]; inline void pull( int x) { val[x] = min(val[L(x)],val[R(x)]); } inline void build( int i, int al, int ar) { l[i] = al, r[i] = ar; if (l[i]==r[i]) { cin >> val[i]; } else { int m = (l[i]+r[i])>>1; build(L(i),l[i],m); build(R(i),m+1,r[i]); pull(i); } } inline int query( int i, int ql, int qr) { if (ql<=l[i] && r[i]<=qr) return val[i]; int m = (l[i]+r[i])>>1, res = 1e9; if (ql<=m) res = min( query(L(i),ql,qr), res); if (qr>m) res = min( query(R(i),ql,qr), res); return res; } ```