这道题是线段树的简单版~
话不多说,直接上代码!
AC代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+5; int sum[maxn*4]; int a[maxn]; void pushup(int root) //求区间最大值 { sum[root]=max(sum[root*2],sum[root*2+1]); } void build(int l,int r,int root) //建树 { if(l==r) { sum[root] = a[l]; return; } int mid=(l+r)/2; build(l,mid,root*2); build(mid+1,r,root*2+1); pushup(root); } void Update(int num,int val,int l,int r,int root) //更新值 { if(l==r&&num==l) { a[num]=val; sum[root]=a[num]; return; } int mid=(l+r)/2; if(num<=mid) Update(num,val,l,mid,root*2); else Update(num,val,mid+1,r,root*2+1); pushup(root);//更新值的同时也要更新区间最大值 } int Query(int be,int ed,int l,int r,int root) //查询区间最大值 { if(be<=l&&r<=ed) //返回区间子集的最大值 return sum[root]; int mid=(l+r)/2; int ans=0; if(be<=mid) ans=max(ans,Query(be,ed,l,mid,root*2)); if(mid<ed) ans=max(ans,Query(be,ed,mid+1,r,root*2+1)); return ans; } char s[10]; //切记不要定义在循环内,因为可以询问多次多个例子,多次内存会爆 int main() { int n,m; while(scanf("%d%d",&n,&m) != EOF) { for(int i=1;i<=n;++i) { scanf("%d",&a[i]); } build(1,n,1); int x,y; while(m--) { scanf("%s",s); if(s[0]=='U') { scanf("%d %d",&x,&y); Update(x,y,1,n,1); } if(s[0]=='Q') { scanf("%d %d",&x,&y); printf("%d ",Query(x,y,1,n,1)); } } } return 0; }