题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
解题思路:
线段树点修改,区间最大值。。。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 200005; int n,m; int a[N]; struct node{ int l,r,maxn; }tree[N<<2]; void build(int m,int l,int r){ tree[m].l = l; tree[m].r = r; if(l == r){ tree[m].maxn = a[l]; return; } int mid = (l+r)>>1; build(m<<1,l,mid); build(m<<1|1,mid+1,r); tree[m].maxn = max(tree[m<<1].maxn,tree[m<<1|1].maxn); } void update(int m,int a,int val){ if(tree[m].l == a && tree[m].r == a){ tree[m].maxn = val; return; } int mid = (tree[m].l+tree[m].r)>>1; if(a <= mid) update(m<<1,a,val); else update(m<<1|1,a,val); tree[m].maxn = max(tree[m<<1].maxn,tree[m<<1|1].maxn); } int query(int m,int l,int r){ if(tree[m].l == l && tree[m].r == r) return tree[m].maxn; int mid = (tree[m].l+tree[m].r)>>1; if(r <= mid) return query(m<<1,l,r); else if(l > mid) return query(m<<1|1,l,r); return max(query(m<<1,l,mid),query(m<<1|1,mid+1,r)); } int main(){ while(~scanf("%d%d",&n,&m)){ for(int i = 1; i <= n; i++) scanf("%d",&a[i]); build(1,1,n); char op; int x,y; while(m--){ getchar(); scanf("%c%d%d",&op,&x,&y); if(op == 'Q') printf("%d\n",query(1,x,y)); else update(1,x,y); } } return 0; }