链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1189
这道题是用线段树去求区间最大值的一道题,树状数组对于这个数据量已经显得无能为力了,这也说明了树状数组和线段树分别适合的不同的题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #define N 100005 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 } 8 int n; 9 struct node 10 { 11 int l; 12 int r; 13 int max; 14 }; 15 node tree[4*N]; 16 int val[N]; 17 void build(int l,int r,int i) 18 { 19 tree[i].l=l; 20 tree[i].r=r; 21 if(l==r) 22 { 23 tree[i].max=val[l]; 24 return; 25 } 26 int mid=(l+r)>>1; 27 build(l,mid,i<<1); 28 build(mid+1,r,i<<1|1); 29 tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max); 30 } 31 int query(int l,int r,int i) 32 { 33 if(tree[i].l==l&&tree[i].r==r) 34 { 35 return tree[i].max; 36 } 37 int mid=(tree[i].l+tree[i].r)>>1; 38 int maxa=0; 39 if(r<=mid) 40 maxa=query(l,r,i<<1); 41 else if(l>mid) 42 maxa=query(l,r,i<<1|1); 43 else 44 maxa=max(query(l,mid,i<<1),query(mid+1,r,i<<1|1)); 45 return maxa; 46 } 47 int main() 48 { 49 int i; 50 int q; 51 int s,t; 52 int icase=1; 53 while(scanf("%d",&n)!=EOF) 54 { 55 for(i=1;i<=n;i++) 56 scanf("%d",&val[i]); 57 build(1,n,1); 58 scanf("%d",&q); 59 printf("Case %d:\n",icase++); 60 while(q--) 61 { 62 scanf("%d%d",&s,&t); 63 printf("%d\n",query(s,t,1)); 64 } 65 } 66 return 0; 67 }