代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int input[N];
const int INF = 1 << 30;struct node {int l, r;int mw;
} tree[4 * N];void init_tree(int n) //初始化,因为要求最小值,所以要初始化为无穷大
{for (int i = 1; i <= 2 * n - 1; i++)tree[i].mw = INF;
}void build(int l, int r, int u)//建树{tree[u].l = l;tree[u].r = r;if (l == r) {tree[u].mw = input[l];
// cout << u << "-" << tree[u].mw << endl;return ;}int mid = (l + r) >> 1;build(l, mid, 2 * u);build(mid + 1, r, 2 * u + 1);tree[u].mw = min(tree[2 * u].mw, tree[2 * u + 1].mw);
}int query(int l, int r, int u) //查询区间[l,r]中的最小值
{if (tree[u].l >= l && tree[u].r <= r) {return tree[u].mw;}if (tree[2 * u].r >= l ) {return query(l, r, 2 * u);}if (tree[2 * u + 1].l <= r) {return query(l, r, 2 * u + 1);}
}void update(int dis, int u, int k) //将第dis个元素改为k
{if (tree[u].l == tree[u].r) {tree[u].mw = k;return ;}if (dis <= tree[2 * u].r)update(dis, 2 * u, k);elseupdate(dis, 2 * u + 1, k);tree[u].mw = min(tree[2 * u].mw, tree[2 * u + 1].mw);
}int main() {int n;cin >> n;for (int i = 1; i <= n; i++)cin >> input[i];int cnt;init_tree(n);build(1, n, 1);update(3,1,1);//将第3个元素改为1cin >> cnt;while (cnt--) {int a, b;cin >> a >> b;cout << query(a, b, 1) << endl;}return 0;
}