这道题和敌兵布阵差不多,也是一道线段树的入门题,直接上代码吧,看不懂的可以问我。

树状数组解法: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;
}