题目:
tree[rt].w=max(tree[rt*2].w,tree[rt*2+1].w);
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
int n,m,x,y,ans;
int a[maxn];
char op[2];
struct node{
int l,r,w;
}tree[maxn<<2];
void build(int l,int r,int rt){
tree[rt].l=l;
tree[rt].r=r;
if(l==r){
tree[rt].w=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
tree[rt].w=max(tree[rt*2].w,tree[rt*2+1].w);
}
void update(int rt){
if(tree[rt].l==tree[rt].r){
tree[rt].w=y;
return;
}
int mid=(tree[rt].l+tree[rt].r)/2;
if(x<=mid) update(rt*2);
else update(rt*2+1);
tree[rt].w=max(tree[rt*2].w,tree[rt*2+1].w);
}
void query(int rt){
if(tree[rt].l>=x && tree[rt].r<=y){
ans=max(ans,tree[rt].w);
return;
}
int mid=(tree[rt].l+tree[rt].r)/2;
if(x<=mid) query(rt*2);
if(y>mid) query(rt*2+1);
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,n,1);
for(int i=1;i<=m;i++){
scanf("%s%d%d",op,&x,&y);
if(op[0]==‘Q‘){
ans=0;
query(1);
printf("%d\n",ans);
}
if(op[0]==‘U‘){
update(1);
}
}
}
return 0;
}
原文:https://www.cnblogs.com/whdsunny/p/10460835.html