标签:
1 #include<stdio.h> 2 #define MAXSIZE 200000 3 int val[MAXSIZE+1]; 4 int max(int x,int y){ 5 return x>y?x:y; 6 } 7 struct node{ 8 int Max,left,right; 9 } tree[MAXSIZE*3]; 10 11 int creat(int root,int left,int right){ 12 tree[root].left=left; 13 tree[root].right=right; 14 if(left == right) 15 return tree[root].Max=val[left]; 16 int a,b,mid=(left+right)>>1; 17 a=creat(root<<1,left,mid); 18 b=creat(root<<1|1,mid+1,right); 19 return tree[root].Max=max(a,b); 20 } 21 int calculate(int root,int left,int right){ 22 if(tree[root].left>right||tree[root].right<left) 23 return 0; 24 if(left<=tree[root].left&&tree[root].right<=right) 25 return tree[root].Max; 26 int a,b; 27 a=calculate(root<<1,left,right); 28 b=calculate(root<<1|1,left,right); 29 return max(a,b); 30 } 31 int update(int root,int pos,int val){ 32 if(pos<tree[root].left||tree[root].right<pos) 33 return tree[root].Max; 34 if(tree[root].left==pos&&tree[root].right==pos) 35 return tree[root].Max=val; 36 int a,b; 37 a=update(root<<1,pos,val); 38 b=update(root<<1|1,pos,val); 39 return tree[root].Max=max(a,b); 40 } 41 int main() 42 { 43 int n,m; 44 while(scanf("%d%d",&n,&m)!=EOF){ 45 for(int i=1;i<=n;i++){ 46 scanf("%d",&val[i]); 47 } 48 creat(1,1,n); 49 for(int i=0;i<m;i++){ 50 char op; 51 int a,b; 52 scanf("\n%c%d%d",&op,&a,&b); 53 if(op==‘Q‘) 54 printf("%d\n",calculate(1,a,b)); 55 else 56 update(1,a,b); 57 } 58 } 59 }
标签:
原文地址:http://www.cnblogs.com/VectorLin/p/5303118.html