#include<stdio.h>
#include<string>
#include<cstring>
#include<queue>
#include<algorithm>
#include<functional>
#include<vector>
#include<iomanip>
#include<math.h>
#include<iostream>
#include<sstream>
#include<set>
#include<climits>
#include<map>
#include<bitset>
using namespace std;
const int MAX=
200005;
int A[MAX],F[
4*MAX];
void build(
int x,
int left,
int right)
{
if (left==right)
{
F[x]=A[left];
return;
}
int mid=(left+right)/
2;
build(x*
2,left,mid);
build(x*
2+
1,mid+
1,right);
F[x]=max(F[x*
2],F[x*
2+
1]);
}
void change(
int x,
int left,
int right,
int pos,
int num)
{
if (left==right)
{
F[x]=num;
return;
}
int mid=(left+right)/
2;
if (pos<=mid)
change(x*
2,left,mid,pos,num);
else
change(x*
2+
1,mid+
1,right,pos,num);
F[x]=max(F[x*
2],F[x*
2+
1]);
}
int query(
int x,
int left,
int right,
int L,
int R)
{
if (left>=L&&right<=R)
return F[x];
if (right<L||left>R)
return -
99999999;
if (left==right)
return F[x];
int mid=(left+right)/
2;
if (R<=mid)
return query(x*
2,left,mid,L,R);
else if (L>mid)
return query(x*
2+
1,mid+
1,right,L,R);
else
return max(query(x*
2,left,mid,L,R),query(x*
2+
1,mid+
1,right,L,R));
}
int main()
{
int N,M,a,b;
char command[
15]={
0};
while (
scanf(
"%d%d",&N,&M)!=EOF)
{
for (
int i=
1;i<=N;i++)
scanf(
"%d",&A[i]);
build(
1,
1,N);
for (
int i=
1;i<=M;i++)
{
scanf(
"%s %d%d",command,&a,&b);
if (command[
0]==
'Q')
printf(
"%d\n",query(
1,
1,N,a,b));
else if (command[
0]==
'U')
change(
1,
1,N,a,b);
}
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-1305940.html