HDU 1754--线段树
中文题,不解释。。
思路:
线段树功能:update:单点替换 quary:区间最值
代码:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define maxn 200100 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int Max[maxn<<2]; 8 int MMax(int a,int b) 9 { 10 return a<b?b:a; 11 } 12 void Pushup(int rt) 13 { 14 Max[rt]=MMax(Max[rt<<1],Max[rt<<1|1]); 15 } 16 void build(int l,int r,int rt) 17 { 18 if(r==l) 19 { 20 scanf("%d",&Max[rt]); 21 return; 22 } 23 int m=(l+r)>>1; 24 build(lson); 25 build(rson); 26 Pushup(rt); 27 } 28 void update(int pos,int add,int l,int r,int rt) 29 { 30 if(r==l) 31 { 32 Max[rt]=add; 33 return; 34 } 35 int m=(l+r)>>1; 36 if(pos<=m) update(pos,add,lson); 37 else update(pos,add,rson); 38 Pushup(rt); 39 } 40 int quary(int L,int R,int l,int r,int rt) 41 { 42 if(L<=l&&R>=r) 43 return Max[rt]; 44 int m=(l+r)>>1; 45 int ret=0; 46 if(L<=m) ret=MMax(quary(L,R,lson),ret); 47 if(R>m) ret=MMax(quary(L,R,rson),ret); 48 return ret; 49 } 50 int main() 51 { 52 int m,n,a,b; 53 char ch; 54 while(~scanf("%d %d",&n,&m)) 55 { 56 build(1,n,1); 57 while(m--) 58 { 59 scanf(" %c %d %d ",&ch,&a,&b); 60 if(ch=='Q') 61 printf("%d\n",quary(a,b,1,n,1)); 62 else 63 update(a,b,1,n,1); 64 } 65 } 66 return 0; 67 }
posted on 2013-02-06 21:50 acoderworld 阅读(37) 评论(0) 收藏 举报