原题链接:http://ac.jobdu.com/problem.php?pid=1544
RMQ线段树。。。
如下:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 using std::min; 7 const int Max_N = 101000; 8 const int INF = 0x7fffffff; 9 struct SegTree{ 10 struct Node{ 11 int v; 12 }seg[Max_N << 2]; 13 void init(int n){ 14 built(1, 1, n); 15 } 16 inline void built(int root, int l, int r){ 17 if (l == r){ 18 scanf("%d", &seg[root].v); 19 return; 20 } 21 int mid = (l + r) >> 1; 22 built(root << 1, l, mid); 23 built(root << 1 | 1, mid + 1, r); 24 seg[root].v = min(seg[root << 1].v, seg[root << 1 | 1].v); 25 } 26 inline int query(int root, int l, int r, int x, int y){ 27 if (x > r || y < l) return INF; 28 if (x <= l && y >= r){ 29 return seg[root].v; 30 } 31 int mid = (l + r) >> 1; 32 int v1 = query(root << 1, l, mid, x, y); 33 int v2 = query(root << 1 | 1, mid + 1, r, x, y); 34 return min(v1, v2); 35 } 36 inline void gogo(int n){ 37 int m, a, b; 38 scanf("%d", &m); 39 while (m--){ 40 scanf("%d %d", &a, &b); 41 printf("%d ", query(1, 1, n, a, b)); 42 } 43 } 44 }sg; 45 int main(){ 46 #ifdef LOCAL 47 freopen("in.txt", "r", stdin); 48 freopen("out.txt", "w+", stdout); 49 #endif 50 int n; 51 while (~scanf("%d", &n)){ 52 sg.init(n), sg.gogo(n); 53 } 54 return 0; 55 }