题意:
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,
现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754
思路:
基本的线段树点修改+查询区间最大值
代码:
#include <bits/stdc++.h> using namespace std; const int MAXN=2e5+5; int tree[MAXN<<2];int a[MAXN]; void push_up(int node) { tree[node]=max(tree[node<<1],tree[node<<1|1]); } void build(int node,int l,int r) { if(l==r) { tree[node]=a[l];return; } int mid=(l+r)>>1; build(node<<1,l,mid); build(node<<1|1,mid+1,r); push_up(node); } void update(int node,int l,int r,int i,int k) { int mid=(l+r)>>1; if(l==r) { a[l]=k;tree[node]=k; return; } if(i<=mid) update(node<<1,l,mid,i,k); else update(node<<1|1,mid+1,r,i,k); push_up(node); } int query(int node,int l,int r,int x,int y) { if(x<=l&&y>=r) { return tree[node]; } int res=0; int mid=(l+r)>>1; if(x<=mid) res=max(res,query(node<<1,l,mid,x,y)); if(y>mid) res=max(res,query(node<<1|1,mid+1,r,x,y)); return res; } 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,1,n); for(int i=1;i<=m;i++) { char str[3]; scanf("%s",str); int x,y; if(str[0]=='Q') { scanf("%d%d",&x,&y); printf("%d ",query(1,1,n,x,y)); } else { scanf("%d%d",&x,&y); update(1,1,n,x,y); } } } return 0; }