hdu--1754 线段树区间求最大值
线段树区间求最大值简单入门题
每次更新的时候递归找到最终的叶子更新完叶子节点值,之后在返回更新父亲节点的值。
1 #include<iostream> 2 #include<string> 3 #define MAX 200010 4 using namespace std; 5 int num[MAX]; 6 struct SegTree 7 { 8 int left,right,value; 9 int calmid() 10 { 11 return (left+right)>>1; 12 } 13 }tt[MAX*3]; 14 15 int bulid(int s,int t,int step) 16 { 17 tt[step].left=s; 18 tt[step].right=t; 19 if(s==t) 20 return tt[step].value=num[s]; 21 int mid=tt[step].calmid(); 22 return tt[step].value=max(bulid(s,mid,step*2),bulid(mid+1,t,step*2+1)); 23 } 24 25 int update(int id,int x,int step) 26 { 27 if(tt[step].right==tt[step].left&&tt[step].left==id){ 28 return tt[step].value=x; 29 } 30 int mid=tt[step].calmid(); 31 if(id<=mid){ 32 return tt[step].value=max(tt[step].value,update(id,x,step*2)); 33 } 34 else return tt[step].value=max(tt[step].value,update(id,x,step*2+1)); 35 } 36 37 int query(int s,int t,int step) 38 { 39 if(s<=tt[step].left&&tt[step].right<=t) 40 return tt[step].value; 41 int mid=tt[step].calmid(); 42 if(t<=mid) 43 return query(s,t,step*2); 44 else if(mid<s) 45 return query(s,t,step*2+1); 46 else return max(query(s,t,step*2),query(s,t,step*2+1)); 47 } 48 //void print(int N) 49 //{ 50 // for(int i=1;i<=N;i++) 51 // cout<<tt[i].left<<" "<<tt[i].right<<" "<<tt[i].value<<endl; 52 // cout<<endl<<endl; 53 //} 54 55 int main() 56 { 57 int N,M,a,b; 58 char c; 59 while(cin>>N>>M){ 60 memset(num,0,sizeof(num)); 61 memset(tt,0,sizeof(tt)); 62 for(int i=1;i<=N;i++) 63 cin>>num[i]; 64 bulid(1,N,1); 65 for(int i=0;i<M;i++) 66 { 67 cin>>c>>a>>b; 68 if(c=='Q') 69 cout<<query(a,b,1)<<endl; 70 else { 71 update(a,b,1); 72 } 73 } 74 75 } 76 return 0; 77 } 78 79 /* 80 5 6 81 6 2 4 3 10 82 Q 1 5 83 U 3 11 84 Q 3 4 85 Q 4 5 86 U 2 12 87 Q 1 5 88 */