RT,下面是代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define min(a, b) ((a) < (b) ? (a) : (b))
const int inf = 0x7f7f7f7f;
int n, q, a[100100], minv[400100];
char s[100];
int query(int o, int l, int r, int ql, int qr) {
int m = (l + r) >> 1, ans = inf;
if (ql <= l && r <= qr) {
return minv[o];
}
if (ql <= m) {
ans = min(ans, query(o << 1, l, m, ql, qr));
}
if (qr > m) {
ans = min(ans, query(o << 1 | 1, m + 1, r, ql, qr));
}
return ans;
}
void update(int o, int l, int r, int p, int v) {
int m = (l + r) >> 1;
if (l == r) {
minv[o] = v;
} else {
if (p <= m) {
update(o << 1, l, m, p, v);
} else {
update(o << 1 | 1, m + 1, r, p, v);
}
minv[o] = min(minv[o << 1], minv[o << 1 | 1]);
}
}
void build(int o, int l, int r) {
if (l == r) {
minv[o] = a[l];
return;
}
int m = (l + r) >> 1;
build(o << 1, l, m);
build(o << 1 | 1, m + 1, r);
minv[o] = min(minv[o << 1], minv[o << 1 | 1]);
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
build(1, 1, n);
for (int _ = 0; _ < q; ++_) {
scanf("%s", s);
if (s[0] == 's') {
int ss[50], vals[50], le = 0;
for (int i = 6; s[i]; ++i) {
if (isdigit(s[i])) {
int x = 0;
while (isdigit(s[i])) {
x = x * 10 + s[i++] - '0';
}
--i;
ss[le] = x;
vals[le++] = a[x];
}
}
for (int i = 1; i < le; ++i) {
update(1, 1, n, ss[i - 1], vals[i]);
a[ss[i - 1]] = vals[i];
}
update(1, 1, n, ss[le - 1], vals[0]);
a[ss[le - 1]] = vals[0];
} else {
int l, r;
sscanf(s, "query(%d,%d)", &l, &r);
printf("%d\n", query(1, 1, n, l, r));
}
}
return 0;
}