题意
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
思路
线段树 单节点更新
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 2000200;
int tree[maxn << 2];
void qmax(int rt)
{
tree[rt] = max(tree[rt << 1], tree[(rt << 1) + 1]);
}
void build(int l, int r, int rt)
{
if (l == r)
{
scanf("%d", &tree[rt]);
return;
}
int m = (r + l) >> 1;
build(l, m, rt << 1);
build(m + 1, r, (rt << 1) + 1);
qmax(rt);
}
void updata(int pos, int data, int l, int r, int rt)
{
if (r == l)
{
tree[rt] = data;
return;
}
int m = (r + l) >> 1;
if (pos <= m)
updata(pos, data, l, m, rt << 1);
else
updata(pos, data, m + 1, r, (rt << 1) + 1);
qmax(rt);
}
int query(int L, int R, int l, int r, int rt)
{
if (L <= l&&R >= r)
{
return tree[rt];
}
int m = (r + l) >> 1;
int ans = -1;
if (L <= m)
ans = max(ans, query(L, R, l, m, rt << 1));
if (R > m)
ans = max(ans, query(L, R, m + 1, r, (rt << 1) + 1));
return ans;
}
int main(void)
{
int n, m;
while (~scanf("%d%d", &n, &m)){
build(1, n, 1);
for (int i = 0; i < m; i++)
{
char s;
int x, y;
cin >> s;
scanf("%d%d", &x, &y);
if (s == 'Q')
{
cout << query(x, y, 1, n, 1) << endl;
}
else
{
updata(x, y, 1, n, 1);
}
}
}
return 0;
}