链接:点这里
题意:给你多组数据,每一组n,m,有n个学生,m次查询,其中Q a b表示查询在a到b区间里的最高分,U a b表示更新a学生的成绩为b。
思路:裸的线段树,记住开数组要*4,hdu是多组输入。我wa了好多次的原因竟然是...query的板子写错了。找区间最大值应该左边和右边分别遍历,我写成了if...else关系
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 200000 + 10;
int tree[maxn << 2];
int n, m;
int maxx[maxn << 2];
void push_up(int node)
{
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
void build(int node, int l, int r)
{
if (l == r)
{
scanf("%d",&tree[node]);
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
push_up(node);
}
void update(int n, int index, int l, int r, int node)
{
if (l == r)
{
tree[node] = n;
return;
}
int mid = (l + r) / 2;
if (index <= mid)
update(n, index, l, mid, node * 2);
else
update(n, index, mid + 1, r, node * 2 + 1);
push_up(node);
}
int query(int node, int L, int R, int l, int r)
{
if (l <= L&&r >= R)
return tree[node];
int mid = (L + R) / 2;
int sum = 0;
if (mid >= l)
sum = max(sum,query(node * 2, L, mid, l, r));
if (mid < r)
sum = max(sum, query(node * 2 + 1, mid + 1, R, l, r));
return sum;
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(tree, 0, sizeof(tree));
build(1, 1, n);
while (m--)
{
getchar();
char x;
scanf("%c", &x);
if (x == 'U')
{
int a, b;
scanf("%d%d", &a, &b);
update(b, a, 1, n, 1);
}
else
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", query(1, 1, n, a, b));
}
}
}
return 0;
}