代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class SegmentTree
{
public:
struct node {
int val;
node() { val = 0; }
node(int val) { this->val = val; }
};
SegmentTree();
SegmentTree(const vector<node>& v);
void updata(int pos, const node& val);
node query(int l, int r);
void clear();
private:
vector<node>tr;
int n;
inline node merge(const node& l, const node& r);
void build(const vector<node>& a, int nl, int nr, int now);
node query(int l, int r, int nl, int nr, int now);
void updata(int pos, const node& val, int nl, int nr, int now);
};
inline SegmentTree::node SegmentTree::merge(const node& l, const node& r) {
return node(min(l.val, r.val));
}
void SegmentTree::build(const vector<node>& a, int nl, int nr, int now) {
if (nl == nr) {
while (tr.size() <= now) {
tr.push_back(node());
}
tr[now] = a[nl-1];
return;
}
int mid = (nl + nr) / 2;
build(a, nl, mid, now << 1);
build(a, mid + 1, nr, now << 1 | 1);
tr[now] = merge(tr[now << 1], tr[now << 1 | 1]);
}
SegmentTree::node SegmentTree::query(int l, int r, int nl, int nr, int now) {
node ret;
if (l <= nl && nr <= r) {
return tr[now];
}
int mid = (nl + nr) / 2;
bool flag = false;
if (mid >= l) {
flag = true;
ret = query(l, r, nl, mid, now << 1);
}
if (mid + 1 <= r) {
if (flag == true) {
ret = merge(ret, query(l, r, mid + 1, nr, now << 1 | 1));
}
else {
ret = query(l, r, mid + 1, nr, now << 1 | 1);
}
}
return ret;
}
void SegmentTree::updata(int pos, const node& val, int nl, int nr, int now) {
if (nl == nr) {
tr[now] = val;
return;
}
int mid = (nl + nr) / 2;
if (pos <= mid) {
updata(pos, val, nl, mid, now << 1);
}
else {
updata(pos, val, mid + 1, nr, now << 1 | 1);
}
tr[now] = merge(tr[now << 1], tr[now << 1 | 1]);
}
SegmentTree::SegmentTree() {
tr.clear();
n = 0;
}
SegmentTree::SegmentTree(const vector<node>& v){
n = v.size();
build(v, 1, v.size(), 1);
}
void SegmentTree::updata(int pos, const node& val) {
updata(pos, val, 1, n, 1);
}
SegmentTree::node SegmentTree::query(int l, int r) {
return query(l, r, 1, n, 1);
}
void SegmentTree::clear() {
tr.clear();
n = 0;
}
int main()
{
ios::sync_with_stdio(false);
int n, m;
SegmentTree ans;
vector<SegmentTree::node>a;
cin >> n;
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
a.push_back(SegmentTree::node(temp));
}
ans = SegmentTree(a);
cin >> m;
for (int i = 0; i < m; i++) {
int op;
cin >> op;
if (op == 0) {
int l, r;
cin >> l >> r;
cout << ans.query(l, r).val << endl;
}
else {
int pos, val;
cin >> pos >> val;
ans.updata(pos, val);
}
}
}