//问最小值
//Q a b 询问(a,b)中最小值
//C a b 将a点值改为b
#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int min(int a, int b)
{
return a>b ? b : a;
}
int tree[4 * maxn];
void pushup(int i)
{
tree[i] = min(tree[i << 1], tree[i << 1 | 1]);
}
void build(int i, int l, int r)
{
if (l == r)
{
scanf("%lld", &tree[i]);
return;
}
int mid = (l + r) / 2;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
void update(int i, int l, int r, int x, int val)
{
if (l == r)///l==x²»±ØÒª
{
tree[i] = val;
return;
}
int mid = (l + r) / 2;
if (x <= mid) update(i << 1, l, mid, x, val);
else update(i << 1 | 1, mid + 1, r, x, val);
pushup(i);
}
int query(int i, int l, int r, int x, int y)
{
if (x <= l && r <= y)
return tree[i];
int minn = 9999999;
int mid = (l + r) / 2;
if (x <= mid) minn = min(minn, query(i << 1, l, mid, x, y));
if (y>mid) minn = min(minn, query(i << 1 | 1, mid + 1, r, x, y));
return minn;
}
int main()
{
int n, m;
int b, c;
char a;
while (scanf("%d%d", &n, &m) != -1)
{
build(1, 1, n);
while (m--)
{
scanf(" %c%d%d", &a, &b, &c);
if (a == 'Q')
printf("%d\n", query(1, 1, n, b, c));
else
update(1, 1, n, b, c);
}
}
return 0;
}
求区间最大值
#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int tree[4 * maxn];
void pushup(int i)
{
tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
}
void build(int i, int l, int r)
{
if (l == r)
{
tree[i] = 0;
return;
}
int mid = (l + r) / 2;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
void update(int i, int l, int r, int x, int val)
{
if (l == r)
{
tree[i] = val;
return;
}
int mid = (l + r) / 2;
if (x <= mid) update(i << 1, l, mid, x, val);
else update(i << 1 | 1, mid + 1, r, x, val);
pushup(i);
}
int query(int i, int l, int r, int x, int y)
{
if (x <= l && r <= y)
return tree[i];
int maxm = 0;
int mid = (l + r) / 2;
if (x <= mid) maxm = max(maxm, query(i << 1, l, mid, x, y));
if (y>mid) maxm = max(maxm, query(i << 1 | 1, mid + 1, r, x, y));
return maxm;
}
int main()
{
int n, m;
int b, c;
char a;
while (~scanf("%d%d", &n, &m))
{
build(1, 1, n);
while (m--)
{
scanf(" %c%d%d", &a, &b, &c);
if (a == 'Q')
printf("%d\n", query(1, 1, n, b, c));
else
update(1, 1, n, b, c);
}
}
}