此题跟
敌兵乱阵相似,
区别在于建树时,父亲的值等于左右儿子的最大值(根据题意)
#include<bits/stdc++.h> using namespace std; const int maxn=200005; int num[maxn]; int tree[maxn*4]; void build(int p,int l,int r) { if(l==r) { tree[p]=num[l]; return; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); tree[p]=max(tree[p<<1],tree[p<<1|1]); } int Find(int p,int l,int r,int x,int y) { if(x<=l&&y>=r) return tree[p]; int mid=(l+r)>>1; if(y<=mid) return Find(p<<1,l,mid,x,y); else if(x>mid) return Find(p<<1|1,mid+1,r,x,y); return (max(Find(p<<1,l,mid,x,mid),Find(p<<1|1,mid+1,r,mid+1,y))); } void change(int p,int l,int r,int x,int num) { if(l==r) { tree[p]=num; return; } int mid=(l+r)>>1; if(x<=mid) change(p<<1,l,mid,x,num); else change(p<<1|1,mid+1,r,x,num); tree[p]=max(tree[p<<1],tree[p<<1|1]); } int main() { char s[2]; int n,m,a,b; while(scanf("%d%d",&n,&m)==2) { for(int i=1;i<=n;i++) scanf("%d",&num[i]); build(1,1,n); while(m--) { scanf("%s%d%d",s,&a,&b); if(s[0]=='Q') printf("%d\n",Find(1,1,n,a,b)); else change(1,1,n,a,b); } } return 0; }