题意 :又是一道中问题,我就不说题意了。。。。
思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了。
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; const int maxn = 500005 ; int a[maxn] ; int ans ; struct node { int l,r,value ; } Node[4*maxn] ; void build(int v ,int l,int r) { Node[v].l = l ; Node[v].r = r ; Node[v].value = 0; if(l == r) { return ; } int mid = (l+r)>>1 ; build(v*2,l,mid) ; build(v*2+1,mid+1,r) ; } int query(int v,int l,int r) { if(Node[v].l == l && Node[v].r == r) return Node[v].value ; int mid = (Node[v].l+Node[v].r) >> 1 ; if(r <= mid) return query(v*2,l,r) ; else { if(l > mid) return query(v*2+1,l,r) ; else return max(query(v*2,l,mid),query(v*2+1,mid+1,r) ); } } void update(int v,int n,int m) { if(Node[v].value < m) Node[v].value = m ; if(Node[v].l == n && Node[v].r == n) { Node[v].value = m ; return ; } else { int mid = (Node[v].l+Node[v].r)>>1 ; if(n <= mid) update(2*v,n,m) ; else if(n > mid) update(2*v+1,n,m) ; } } int main() { int n,m ; while(~scanf("%d %d",&n,&m)) { build(1,1,n) ; ans = 0; for(int i = 1 ; i <= n ; i++) { scanf("%d",&a[i]) ; update(1,i,a[i]) ; } char ch[31] ; for(int i = 1 ; i <= m ; i++) { getchar() ; scanf("%s",ch) ; int a,b ; if(ch[0] == 'Q') { scanf("%d %d",&a,&b) ; printf("%d\n",query(1,a,b)) ; } else if(ch[0] == 'U') { scanf("%d %d",&a,&b) ; update(1,a,b) ; } } } return 0; }