简单的单点修改,求区间最值
#include<bits/stdc++.h>
#define max_N 800000
using namespace std;
int ans; //求和
int big; //求最大值
struct seg{
int l,r,v,maxn;
}tree[max_N];
void build(int l,int r,int k) {
tree[k].l=l;
tree[k].r=r;
tree[k].v=0;
tree[k].maxn=0;
if(tree[k].l==tree[k].r) return;
int mid=(l+r)>>1;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
}
void update(int num,int v,int k) {
if(tree[k].l==tree[k].r&&tree[k].r==num) {
tree[k].v=v;
tree[k].maxn=v;
return;
}
int mid=(tree[k].l+tree[k].r) >> 1;
if(num<=mid) {
update(num,v,k*2);
}
else {
update(num,v,k*2+1);
}
if(v>tree[k].maxn) {
tree[k].maxn=v;
}
}
void query(int l,int r,int k) {
if(tree[k].l==l&&tree[k].r==r) {
if(tree[k].maxn>big) {
big=tree[k].maxn;
}
return;
}
int mid=(tree[k].l+tree[k].r) >>1;
if(r<=mid) {
query(l,r,2*k);
}
else if(l>mid) {
query(l,r,2*k+1);
}
else {
query(l,mid,2*k);
query(mid+1,r,2*k+1);
}
}
int main()
{
int n,m;
int temp;
char s[10];
int x,y;
while(scanf("%d%d",&n,&m)!=EOF) {
build(1,n,1);
for(int i=1;i<=n;i++) {
scanf("%d",&temp);
update(i,temp,1);
}
for(int i=1;i<=m;i++) {
scanf("%s%d%d",s,&x,&y);
if(s[0]=='Q') {
big=0;
query(x,y,1);
printf("%d\n",big);
}
if(s[0]=='U') {
update(x,y,1);
}
}
}
return 0;
}