这道题和敌兵布阵差不多,也是一道线段树的入门题,直接上代码吧,看不懂的可以问我。
树状数组解法:https://blog.csdn.net/charles_zaqdt/article/details/81094197
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
#define maxn 200005
using namespace std;
int sum[maxn << 2];
int n,m;
string str;
void Pushup(int o){
sum[o] = max(sum[o << 1] , sum[o << 1 | 1]);
}
void Build(int l, int r, int o){
if(l == r){
scanf("%d",&sum[o]);
return ;
}
int mid = (l + r) >> 1;
Build(lson);
Build(rson);
Pushup(o);
}
void Update(int x, int ans, int l, int r,int o){
if(l == r){
sum[o] = ans;
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) Update(x, ans, lson);
else Update(x, ans, rson);
Pushup(o);
}
int Query(int L, int R, int l, int r, int o){
if(L <= l && r <= R){
return sum[o];
}
int mid = (l + r) >> 1;
int ans = 0;
if(L <= mid) ans = max(ans, Query(L, R, lson));
if(R > mid) ans = max(ans, Query(L, R, rson));
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
Build(1,n,1);
while(m--){
cin>>str;
if(str[0] == 'U'){
int x,y;
scanf("%d%d",&x,&y);
Update(x,y,1,n,1);
}
else{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",Query(x,y,1,n,1));
}
}
}
return 0;
}