rt,十分感谢
#include<cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5;
ll w[MAXN*4],a[MAXN],n,q;
inline ll ls(ll u){return u<<1;}
inline ll rs(ll u){return u<<1|1;}
void push_back(const ll u){w[u]=max(w[ls(u)],w[rs(u)]);}
void build(const ll u,ll l,ll r){
if(l==r){
w[u]=a[l];
return;
}
ll mid=(l+r)>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
push_back(u);
}
bool in(ll L,ll R,ll l,ll r,bool t){return t?(l<=L)&&(R<=r):!((R<l)||(L>r));}
ll query(ll u,ll L,ll R,ll l,ll r,ll mod=-1){
if(in(L,R,l,r, true)){
return w[u];
}else if(in(L,R,l,r, false)){
ll mid=(L+R)>>1;
return max(query(ls(u),L,mid,l,r),query(rs(u),mid+1,R,l,r));
}else{return 0;}
}
void update(ll u,ll l,ll r,ll t,ll x){
if(l==r&&l==t&&r==t){
if(w[u]<x){
w[u]=x;
return;
}
}
ll mid=(l+r)>>1;
if(t<=mid){
update(ls(u),l,mid,t,x);
}else{
update(rs(u),mid+1,r,t,x);
}
push_back(u);
}
int main(){
scanf("%lld%lld",&n,&q);
for (int i = 1; i <=n ; ++i) {
scanf("%lld",&a[i]);
}
build(1,1,n);
for (int i = 1; i <=q ; ++i) {
char op;
ll A,B;
cin>>op;
scanf("%lld%lld",&A,&B);
if(op=='U'){
update(1,1,n,A,B);
}else{
printf("%lld\n", query(1,1,n,A,B));
}
}
return 0;
}
顺便问一下我query第二个if写的是直接判断一部分相交然后return,但我看很多人在这个部分写的是if(l<=mid) (递归部分)
if(mid<r) (递归部分)
二者有什么区别吗