HDU 1754 I Hate It
线段树单点更新第二题,这题就比上次有进步,交了一发就AC了哈哈哈。
还是很简单的,只不过是更新的时候更新成了区间的最大值。
下面是代码:
#include <stdio.h> const int Maxn=200005; int node[Maxn<<2]; int max(int a,int b) { if(a<b)a=b; return a; } void PushUp(int tr) { node[tr]=max(node[tr<<1],node[tr<<1|1]); } void Build(int l,int r,int tr) { if(l==r) { scanf("%d",&node[tr]); return; } int m=(l+r)>>1; Build(l,m,tr<<1); Build(m+1,r,tr<<1|1); PushUp(tr); } int query(int L,int R,int l,int r,int tr) { if(L<=l&&r<=R)return node[tr]; int m=(l+r)>>1,ans=-1; if(L<=m)ans=max(ans,query(L,R,l,m,tr<<1)); if(R>m)ans=max(ans,query(L,R,m+1,r,tr<<1|1)); return ans; } void update(int p ,int num,int l,int r,int tr) { if(l==r) { node[tr]=num; return; } int m=(l+r)>>1; if(p<=m)update(p,num,l,m,tr<<1); else update(p,num,m+1,r,tr<<1|1); PushUp(tr); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { Build(1,n,1); char s[3]; int a,b; for(int i=0; i<m; i++) { scanf("%s",s); scanf("%d%d",&a,&b); if(s[0]=='Q')printf("%d\n",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0; }