首页 > 代码库 > HDU 1754

HDU 1754

第一题线段树,纪念一下

 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 int  tree[800005]; 5 void build(int l,int r,int root){ 6     if(l==r){ 7         scanf("%d",&tree[root]); 8     } 9     else {10         int mid=(l+r)/2;11         build(l,mid,root*2);12         build(mid+1,r,root*2+1);13         tree[root]=max(tree[root*2],tree[root*2+1]);14     }15 }16 void updata(int x,int y,int l,int r,int root){17     if(l==r){18         tree[root]=y;19     }20     else {21         int mid=(l+r)/2;22         if(x<=mid)updata(x,y,l,mid,root*2);23         else updata(x,y,mid+1,r,root*2+1);24         tree[root]=max(tree[root*2],tree[root*2+1]);25     }26 }27 int query(int x,int y,int l,int r,int root){28     if(x<=l&&y>=r){29         return tree[root];30     }31     else {32         int sum=0,mid=(l+r)/2;33         if(x<=mid)sum=max(sum,query(x,y,l,mid,root*2));34         if(y>mid)sum=max(sum,query(x,y,mid+1,r,root*2+1));35         return sum;36     }37 }38 int main(){39 40     int n,m,x,y;41     char s[5];42     while(scanf("%d%d",&n,&m)!=EOF){43         build(1,n,1);44         for(int i=0;i<m;i++){45             scanf("%s%d%d",s,&x,&y);46             if(s[0]==U)updata(x,y,1,n,1);47             else printf("%d\n",query(x,y,1,n,1));48         }49     }50     return 0;51 }