题意:老师询问被编号为1~n的学生中的某个区间内学生的最高分。
老师也可以更新某个学生的分数。
#include <iostream>
#include <cstdio>
using namespace std;
#define N 200005
#define M 2005
int maxsc[N << 2]; //存储区间内的最高分数。
inline int MAX(int a, int b)
{
return a > b ? a : b;
}
void pushUp(int rt)
{
maxsc[rt] = MAX(maxsc[rt << 1], maxsc[rt << 1 | 1]);
}
void build(int l, int r, int rt)
{
if (l == r)
{
scanf ("%d", &maxsc[rt]);
return;
}
int m = (l + r) >> 1;
build (l, m, rt << 1);
build (m + 1, r, rt << 1 | 1);
pushUp(rt);
}
void update(int l, int r, int rt, int id, int sc)
{
if (l == r)
{
maxsc[rt] = sc;
return;
}
int m = (l + r) >> 1;
if (m >= id) update(l, m, rt << 1, id, sc);
else update(m + 1, r, rt << 1 | 1, id, sc);
pushUp(rt);
}
int query(int l, int r, int rt, int L, int R)
{
if (l >= L && r <= R) return maxsc[rt];
int m = (l + r) >> 1, tmp = 0; //必须初始化
if (m >= L) tmp = query(l, m, rt << 1, L, R);
if (m < R) tmp = MAX(tmp, query(m + 1, r, rt << 1 | 1, L, R));
return tmp; //当上面的两个if不成立,返回0
}
int main()
{
int n, m;
while(scanf ("%d %d", &n, &m) != EOF)
{
build(1, n, 1);
char ch;
int a, b;
while (m--)
{
scanf ("\n%c %d %d", &ch, &a, &b);
if (ch == 'U') update(1, n, 1, a, b);
else printf ("%d\n", query(1, n, 1, a, b));
}
}
return 0;
}